首页 > 解决方案 > 在打字稿中将接口作为具有索引签名的类型传递

问题描述

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

考虑以下示例

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 不同:类型中缺少索引签名,因为 readonly 修饰符意味着该DoSomething函数无法将新属性添加到args. 这意味着一个实例在被调用MyArgs之后仍然会遵守这个接口签名。DoSomething

我如何在 Typescript 中表示这一点?还有另一种我想念的方法吗?

标签: typescript

解决方案


如果属性类型兼容,则对象字面量类型可分配给具有索引签名的类型,但接口类型不兼容;看到这个评论。一旦你注释someArgs为 type MyArgs,它是一个对象字面量的信息就会丢失,只有MyArgstype 用于检查参数类型的可分配性DoSomething。修饰符无关紧要:readonly问题是是否someArgs满足 TypeScript(非常不完美)的启发式,因为传递给DoSomething.

要使示例正常工作,您只需更改MyArgs为对象文字类型:

type MyArgs = {
    foo: string;
    bar: string;
};

推荐阅读