TypeScript:实现具有调用签名和索引签名的接口

时间:2018-04-05 12:54:43

标签: typescript types

我想创建一个满足这种类型的对象:

call "C:\Program Files (x86)\Embarcadero\RAD Studio\7.0\bin\rsvars.bat"
msbuild "C:\Users\carlos.santos\Desktop\teste\Project1.dproj" /p:_EnvLibraryPath="C:\Program Files (x86)\Embarcadero\RAD Studio\7.0\lib\EN;C:\Program Files (x86)\Embarcadero\RAD Studio\7.0\lib"

并传递TypeScript类型检查。理想情况下,我不想采用诸如使用interface I { (): string; [x: string]: number; } 作为中间步骤的技巧。

我知道可以将其他字段添加到具有呼叫签名的界面中,如下所述:Implementing TypeScript interface with bare function signature plus other fields

我试着写:

any

但我收到错误:const foo: I = Object.assign( // Callable signature implementation () => 'hi', { // Additional properties text2: 3 } )

我很想知道是否有办法创建实现接口Type '(() => "hi") & { text2: number; }' is not assignable to type 'I'. Index signature is missing in type '(() => "hi") & { text2: number; }'.的对象。

2 个答案:

答案 0 :(得分:1)

如果您不将类型定义为接口,而是将交叉类型的类型别名定义,则可以在没有断言的情况下执行此操作:

type I =  {
    (): string;
} & {
    [x: string]: number;
}
// Will work
let d:I= Object.assign(function() { return ""}, {
    text: 10
});

不确定为什么一个有效而另一个无效,它们的公共结构本质上是相同的,它可能是一个编译器错误。

修改提交bug我们必须等待回复

答案 1 :(得分:0)

您可以执行this

之类的操作

基本上你首先使用正确的调用签名声明一个函数, 然后使用正确的索引签名添加任何属性。然后使用类型断言的as关键字返回值(或分配给示例中的新引用)。

事件simpler,在第一个声明中使用type asstertion。