Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
TypeScript:实现一个既有调用签名又有索引签名的接口_Typescript_Types - Fatal编程技术网

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类型系统的项目,我试图看看调用签名和索引签名是否可以共存。我会关注你提交的问题。谢谢