TypeScript:实现一个既有调用签名又有索引签名的接口
我想创建一个满足此类型的对象:TypeScript:实现一个既有调用签名又有索引签名的接口,typescript,types,Typescript,Types,我想创建一个满足此类型的对象: interface I { (): string; [x: string]: number; } 并通过类型脚本类型检查。理想情况下,我不想求助于技巧,例如使用any作为中间步骤 我知道可以向具有调用签名的接口添加其他字段,如下所述: 我试着写: const foo: I = Object.assign( // Callable signature implementation () => 'hi', {
interface I {
(): string;
[x: string]: number;
}
并通过类型脚本类型检查。理想情况下,我不想求助于技巧,例如使用any
作为中间步骤
我知道可以向具有调用签名的接口添加其他字段,如下所述:
我试着写:
const foo: I = Object.assign(
// Callable signature implementation
() => 'hi',
{
// Additional properties
text2: 3
}
)
但是我得到了错误:Type'(()=>“hi”)&{text2:number;}'不能分配给Type'I'。类型“(()=>“hi”)&{text2:number;}”中缺少索引签名。
我很想知道是否有一种方法可以创建一个对象实现接口
I
您可能可以这样做
基本上,首先声明一个具有正确调用签名的函数,
然后添加具有正确索引签名的任何属性。然后使用类型断言的as
关键字返回值(或分配给新引用,如示例中所示)
事件,在第一个声明中使用类型关联。如果不将类型定义为接口,而是定义为交叉点类型的类型别名,则无需断言即可执行此操作:
type I = {
(): string;
} & {
[x: string]: number;
}
// Will work
let d:I= Object.assign(function() { return ""}, {
text: 10
});
不知道为什么一个可以工作,但另一个不行,它们的公共结构基本相同,这可能是一个编译器错误
编辑提交了一份我们将不得不等待回复我怀疑这主要是因为TypeScript允许未经检查的类型转换。例如,这同样有效:是的,这是真的,我更新了。您可以在声明中使用类型断言。作为旁注,这有缺点,您仍然可以使用函数原型的方法吗?如果要保留这些方法,可能需要删除或合并某些接口。您提供的两个链接包含相同的代码。试着按下
Share
按钮来生成一个新的链接。我想说的是,通过使用as
,你实际上绕过了类型系统,利用了TypeScript中已知的不健全源。我在寻找是否有一种方法可以在不使用类型转换的情况下,通过任何或类似的功能来获得所需的类型。显然,至少现在是这样,但问题仍然标记为“讨论中”@jcalz你确定这是同一个问题吗?上面的问题甚至在类型I={():string;[x:string]:number;}
时也会表现出来,从我在讨论中读到的内容来看,因为它是类型
它应该可以工作,我没有尝试类型
。。。有趣。我会更深入地研究它。我想隐式索引签名很奇怪。。。也许我会就此提出一个问题,看看人们怎么想。@jcalz你介意我这样做吗?我一直想参与一段时间,这似乎是一个好问题,我今天晚些时候打算对此进行调查。我报告了一个关于您的问题的bug,如果您提供了您遇到此问题的真实世界用例,这将有所帮助。10x@TitianCernicova Dragomir我在野外没有遇到过这个问题。我正在做一个关于TypeScript类型系统的项目,我试图看看调用签名和索引签名是否可以共存。我会关注你提交的问题。谢谢