typescript - 如何用“记录”替换“对象”`?
问题描述
考虑一下:
interface Foo {
foo: string;
}
const foo: Foo = { foo: "foo" };
function bar(obj: object) {} // <--- ERROR 1
bar(foo);
function baz(obj: Record<string, unknown>) {}
baz(foo); // <--- ERROR 2
因此,错误 1 是:
Don't use `object` as a type. The `object` type is currently hard to use ([see this issue](https://github.com/microsoft/TypeScript/issues/21732)).
Consider using `Record<string, unknown>` instead, as it allows you to more easily inspect and use the keys.eslint@typescript-eslint/ban-types
因此,我做了我被告知的事情,object
并被Record<string, unknown>
in取代baz
。但是,现在我得到错误 2:
Argument of type 'Foo' is not assignable to parameter of type 'Record<string, unknown>'.
Index signature for type 'string' is missing in type 'Foo'.ts(2345)
那么,避免使用的正确方法是object
什么?
解决方案
这是当前 TypeScript 的一个已知问题。
您应该更改Foo
为 atype
而不是 a interface
:
type Foo = {
foo: string
};
const foo: Foo = { foo: "foo" };
function baz(obj: Record<string, unknown>) {}
baz(foo);
编辑:如果您对界面没有任何控制权,您可以使用 Younho Choo 在上述 GitHub 问题线程上创建的此实用程序类型:
interface Foo {
foo: string;
}
type IndexSignature<O extends object> = {
[P in keyof O]: O[P]
};
const foo: IndexSignature<Foo> = { foo: "foo" };
function baz(obj: Record<string, unknown>) {}
baz(foo);
这避免了使用any
某些开发人员认为不好的做法(尽管我认为在 TmTron 的回答中这是完全可以接受的做法)。
推荐阅读
- bash - 如何在 bash 脚本中使用动态选项/参数执行 cmd
- java - Spring Flux(或 Java Stream)合并为左连接
- sql-server - 如何在 SQL Server 中动态创建表?
- c - 在另一个函数中分配内存的变量
- amazon-web-services - 将静态 IP 分配给容器或无服务器解决方案
- mongodb - bindIP 不允许 IP 地址范围
- android - Firebase 实时数据库不保存包含列表或地图属性的 POJO
- json - VBA解析json并循环不同的对象
- c# - 使用SqlbulkcopycolumnMapping将数据从datatable复制到sql数据库
- image - Flutter Navigation 和同时对 dispose() 的要求