我希望能够将接口传递给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中表示呢?还有其他我想念的方式吗?
答案 0 :(得分:1)
如果属性类型兼容,则可以将对象文字类型分配给具有索引签名的类型,而接口类型则不可以;参见this comment。将someArgs
注释为类型MyArgs
后,将丢失作为对象文字的信息,只有MyArgs
类型用于检查对DoSomething
参数类型的可分配性。 readonly
修饰符是无关紧要的:问题是someArgs
是否满足TypeScript的(非常不完美的)启发式,因为它不太可能在 之前被添加了非字符串属性,然后传递给{ {1}}。
要使示例工作起来,您只需将DoSomething
更改为对象文字类型:
MyArgs