`?,typescript,tslint"/>

首页 > 解决方案 > 如何用“记录”替换“对象”`?

问题描述

考虑一下:

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什么?

标签: typescripttslint

解决方案


这是当前 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 的回答中这是完全可以接受的做法)。

打字稿游乐场


推荐阅读