假设我有以下类型脚本代码:

type fruit = "apple" | "banana" | "pear"
type color = "red" | "yellow" | "green"

我想创建一个类型,每个水果都有一个数字属性,每个 colored颜色 都有一个布尔属性,比如

type FruitsAndColors = {
  [key in fruit]: number;
  [key in color]: boolean
}

不幸的是,这个错误会显示消息"映射类型可能不会声明属性或方法",但它编译得很好.这里到底发生了什么?

我可以用这样的方法来解决这个问题

type FruitsAndColors = {
  [key in fruit]: number;
} & {
  [key in color]: boolean
}

但我想知道真正的问题是什么.

推荐答案

这不是"vscode的typescript扩展",而是TypeScript.它不允许在一个type构造中进行两个映射.只是构造的语法不允许这样.

相反,你要做你展示的事情:

type FruitsAndColors = {
    [key in fruit]: number;
} & {
    [key in color]: boolean
};

但是请注意,类型requires all six properties将出现在对象中.也许这就是你想要的,但如果不是,在映射的关键点后添加?(或将整个内容包装在Partial<>中):

type FruitsAndColors = {
    [key in fruit]?: number;
} & {
    [key in color]?: boolean
};
// Or
type FruitsAndColors = Partial<{
    [key in fruit]: number;
} & {
    [key in color]: boolean
}>;

Playground for the above

Typescript相关问答推荐

如何使类型只能有来自另一个类型的键,但键可以有一个新值,新键应该抛出一个错误

泛型函数即使没有提供类型

无法从Chrome清除还原的初始状态数据

TS2339:类型{}上不存在属性消息

为什么有条件渲染会导致material 自动完成中出现奇怪的动画?

使用订阅时更新AG网格中的行

Angular 自定义验证控件未获得表单值

正交摄影机正在将渲染的场景切成两半

刷新时保持当前名称的Angular

错误:NG02200:找不到类型为';对象';的其他支持对象';[对象对象]';.例如数组

在Reaction中折叠手风琴

具有匹配功能的TS通用事件处理程序

Angular NG8001错误.组件只能在一个页面上工作,而不是在她的页面上工作

在抽象类构造函数中获取子类型

三重融合视角与正交阵

内联类型断言的工作原理类似于TypeScrip中的断言函数?

有没有一种简单的方法可以访问Keyboard Shortcuts JSON文件中列出的每个命令的显示名称(标题)?

具有枚举泛型类型的 Typescript 对象数组

使用受保护的路由和入门来响应路由

在 TypeScript 中实现类型级别深度优先搜索