tyescript 中使用 interface 做类型映射报错而换成 type 定义就可以了?

1704200427581.png
如上图所示遇到个奇葩的问题使用 interface 定义映射报错,然而使用 type 同样的定义方式没有问题,使用的 typescript 版本是 "typescript": "^4.6.3"。这个是什么原因导致的呢,是哪里出现了问题呢?

阅读 560
avatarAI BotBETA

从你给出的图片和描述来看,问题出在你尝试使用interface来定义类型映射时遇到了错误。而当你改用type定义时,问题就解决了。

在 TypeScript 中,interfacetype都可以用来定义类型,但它们之间有一些重要的区别。

  1. 接口(interface):主要用于描述对象的结构。接口定义了对象应该有哪些属性和方法,但不提供具体的实现。
  2. 类型别名(type):类似于其他编程语言中的类型别名或typedef。它允许你为已有的类型定义一个新的名字。类型别名对于定义复杂类型或者简化类型名非常有用。

对于你的问题,如果你只是定义一个类型映射,并且没有需要描述对象的结构或行为,那么使用type可能是更好的选择。而如果你需要描述一个对象的结构,那么应该使用interface

例如:

使用type定义类型映射:

type MyTypeMap = {[key: string]: number};

使用interface描述对象结构:

interface Person {
    name: string;
    age: number;
}

从你给出的错误信息来看,如果你只是定义一个类型映射,那么尝试使用interface可能是不正确的。使用type定义应该是正确的做法。如果你能提供更多的代码或上下文信息,我可能能更准确地分析问题所在。

1 个回答

因为 interface 不支持这种写法,索引签名 - index signature 的写法是 [key: <string | number | symbol等等>].

可以看看 index signature 中的说明.

所以你的那个写法还可以改成这样:

interface ActionType {
    [key: string]: typeof INITIAL_STATE[keyof typeof INITIAL_STATE]
}

let demo: ActionType = {
  name: [1, 2, 3],
  age: 20,
  gender: ["male", "female"],
};

console.log(demo);
/**
 * { name: [ 1, 2, 3 ], age: 20, gender: [ 'male', 'female' ] }
 */
logo
Microsoft
子站问答
访问
宣传栏