推断为任意的增强函数签名参数

Augmented function signature's parameters inferred as any

提问人:Alexander Cerutti 提问时间:11/15/2023 最后编辑:Alexander Cerutti 更新时间:11/15/2023 访问量:43

问:

我正在尝试增强一个包的界面,这是我无法控制的。tizen-tv-webapis

该接口拥有一个作为函数的属性。该函数具有第二个参数的签名。object

interface AVPlayPlaybackCallback {
    ondrmevent?(type: AVPlayDrmType, data: object): void;
}

我想将其设置为一组缩小的属性,而不是一个宽泛的泛型对象,因为我们看到 API 似乎返回该特定形状。

// overrides.d.ts

import type { AVPlayDrmType } from "tizen-tv-webapis";

declare module "tizen-tv-webapis" {
    export interface AVPlayPlaybackCallback {
        ondrmevent?(type: AVPlayDrmType, data: {
            name: string;
            message: string;
        }): void;
    }
}

Typescript 似乎能够看到我创建的包含增强的文件。

但是,当我尝试创建一个符合接口的对象时,它会向我建议签名,但这两个参数都自动变为 .any

const AVPlayListeners = {
    ondrmevent: (type, data) => {
//               ^^^^  ^^^^  ---> any
    };
};

enter image description here

enter image description here

enter image description here

我在这里创建了一个重现案例:https://stackblitz.com/edit/typescript-bbiuze?file=overrides.d.ts

我不明白为什么它说它是任何签名,而签名几乎相同。 必须指定参数会使增强变得毫无用处。

当然,如果没有增强,参数可以正确推断。

这是我的:tsconfig.json

{
    "compilerOptions": {
        "target": "es5",
        "module": "es2015",
        "lib": ["DOM", "ES2015", "ES2017.Object", "ES2018.Promise", "ES2016.Array.Include"],
        "sourceMap": true,
        "jsx": "react",
        "declaration": true,
        "esModuleInterop": true,
        "moduleResolution": "node",
        "importHelpers": true,
        "typeRoots": [
            "node_modules/@types",
            "node_modules/<organization>/types"
        ],
        "types": ["node"],
        "forceConsistentCasingInFileNames": true,
        "downlevelIteration": true,
        "baseUrl": ".",
    },
    "exclude": ["node_modules", "dist", "packages/*/node_modules", "packages/*/dist"]
}

有谁知道这里发生了什么?

谢谢。

TypeScript 类型 模块扩充

评论

0赞 jcalz 11/15/2023
将此处的代码编辑为没有伪代码的纯文本最小可重现示例(例如,),请注意,不幸的是,IDE的屏幕截图不适合在这里使用。请将代码/日志/错误/工具提示的图像替换为纯文本版本。目标是其他人可以将代码复制并粘贴到他们自己的 IDE 中并开始解决问题,而无需清除您没有遇到的问题(语法错误)或将图片转录为文本。谢谢!...
0赞 Alexander Cerutti 11/15/2023
@jcalz 我已经编辑并添加了一个复制案例。我决定保留屏幕截图,因为恕我直言,它们只提供了有关我所说的内容的更多信息,尽管它们现在对于理解这个问题并不是必不可少的。让我知道这对你来说是否合适,或者我是否应该改变其他任何东西。感谢。
0赞 jcalz 11/15/2023
所以你的问题只是你没有注释?注释使这个问题消失了。如果这是您的问题,那么解决起来似乎很容易。如果这不是你的问题,那是什么?AVPlayListeners
0赞 Alexander Cerutti 11/15/2023
问题是,当我使用模块扩充时,Intellisense 似乎无法推断出正确的类型。即使我做了注释(我以前尝试过,我忘了写),并且仍然被认为是.typedataany
0赞 Alexander Cerutti 11/15/2023
如果将增强放置在与使用它相同的文件中,则行为似乎有所不同......typescriptlang.org/play?target=99#code/......

答:

0赞 Alexander Cerutti 11/15/2023 #1

根据评论中强调的内容,该问题似乎在 .noImplicitAny: truetsconfig.json

通过添加它,参数将有可能成为,因此,编译器被强制显示签名。any