typescript - 在打字稿中将接口作为具有索引签名的类型传递
问题描述
我希望能够将接口传递给打字稿中的某个函数,该函数可以接受任何对象类型,只要它的所有属性都是某种类型。
考虑以下示例:
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 中表示这一点?还有另一种我想念的方法吗?
解决方案
如果属性类型兼容,则对象字面量类型可分配给具有索引签名的类型,但接口类型不兼容;看到这个评论。一旦你注释someArgs
为 type MyArgs
,它是一个对象字面量的信息就会丢失,只有MyArgs
type 用于检查参数类型的可分配性DoSomething
。修饰符无关紧要:readonly
问题是是否someArgs
满足 TypeScript(非常不完美)的启发式,因为在传递给DoSomething
.
要使示例正常工作,您只需更改MyArgs
为对象文字类型:
type MyArgs = {
foo: string;
bar: string;
};
推荐阅读
- java - MVC 控制器通信
- c - 字符串的typedef char指针分配
- php - POST 请求有时返回代码 302,有时返回代码 200
- datetime - 用均值上采样数据
- cgi - 无法运行 CGI 脚本
- excel - 为文本分配类别
- kubernetes - 如何使用 init 容器检查 MySQL 是否准备好连接?
- python - Discord.py 使用他们的 ID 向用户发送 DM
- flutter - Using same riverpod state provider for multiple pages
- spring - 在没有 @DirtiesContext 的情况下如何在 Quarkus 中实现集成测试?