gpt4 book ai didi

typescript 模板文字作为界面键

转载 作者:行者123 更新时间:2023-12-03 23:26:16 26 4
gpt4 key购买 nike

假设我想在 typescript 中创建一个包含多个项目的对象,如下所示:

const obj: Items = {
item1: 'foo',
item2: 'bar',
item3: 'baz',
}
我应该如何声明我的 Items 类型以使其与任意数量的项目兼容?我使用 Typescript 4.1 中的模板文字尝试了以下操作,但它似乎不起作用:
interface Items {
[P: `array${number}`]: any;
}
是否可以声明这样的类型?

最佳答案

TS4.4+ 更新
TypeScript 4.4 将支持包含模式模板文字的索引签名,如在 microsoft/TypeScript#44512 中实现的那样。然后,您将能够将 Items 声明为特定类型,如下所示:

interface Items {
[key: `item${number}`]: any;
}
您可以验证它是否按需要工作:
const obj: Items = {
item1: 'foo',
item2: 'bar',
item2021: 'baz',
item3: 'qux',
};

const objBad: Items = {
item1: 'foo',
item2: 'bar',
itemMMXXI: 'baz', // error!
// ~~~~~~~~~ <--
// Object literal may only specify known properties,
// and 'itemMMXXI' does not exist in type 'Items'
item3: 'qux'
};
Playground link to code

TS4.1-4.3 的答案
从 TypeScript 4.1 开始,目前不允许将 `item${number}` 形式的模式模板文字(在 microsoft/TypeScript#40598 中实现)作为键类型。

目前没有与您所需的 Items 类型相对应的特定类型。相反,您可以将其表示为类型的约束并编写一个辅助函数 asItems() ,该函数只接受符合约束的输入:
const asItems = <K extends PropertyKey>(
obj: { [P in K]: P extends `item${number}` ? any : never }
) => obj;
将检查传入的 obj 的每个键是否可分配给 `item${number}` 。如果是,则属性类型为 any ,否则,属性类型为 never 。这往往会导致任何违规属性出现错误:
const obj = asItems({
item1: 'foo',
item2: 'bar',
item2021: 'baz',
item3: 'qux',
}); // okay

const objBad = asItems({
item1: 'foo',
item2: 'bar',
itemMMXXI: 'baz', // error!
// ~~~~~~~~~ <-- Type 'string' is not assignable to type 'never'
item3: 'qux'
});
Playground link to code

关于 typescript 模板文字作为界面键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65878880/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com