在打字稿中将接口作为带有索引签名的类型进行传递

时间:2018-09-05 05:15:56

标签: typescript

我希望能够将接口传递给Typescript中的某个函数,该函数可以接受任何对象类型,只要它的所有属性都属于某种类型即可。

请考虑以下example

function DoSomething(args: { readonly [propertyName: string]: string }) {
    // do something
}

// MyArgs is really just a more strongly typed version of {[propertyName: string]: string}
interface MyArgs {
    foo: string;
    bar: string;
}

var someArgs: MyArgs = {
    foo: "foo",
    bar: "bar"
}

DoSomething({ foo: "foo", bar: "bar" }); // works
DoSomething(someArgs); // compile error: Index signature is missing in type 'MyArgs'

这不起作用,因为无法将someArgs强制转换为用于函数参数的参数类型。

这与Typescript: Index signature is missing in type不同,因为它具有只读修饰符,这意味着DoSomething函数无法向args添加新属性。这意味着MyArgs的实例在针对其调用DoSomething之后仍将遵循此接口签名。

如何在Typescript中表示呢?还有其他我想念的方式吗?

1 个答案:

答案 0 :(得分:1)

如果属性类型兼容,则可以将对象文字类型分配给具有索引签名的类型,而接口类型则不可以;参见this comment。将someArgs注释为类型MyArgs后,将丢失作为对象文字的信息,只有MyArgs类型用于检查对DoSomething参数类型的可分配性。 readonly修饰符是无关紧要的:问题是someArgs是否满足TypeScript的(非常不完美的)启发式,因为它不太可能在 之前被添加了非字符串属性,然后传递给{ {1}}。

要使示例工作起来,您只需将DoSomething更改为对象文字类型:

MyArgs