![](/img/trans.png)
[英]TypeScript: from a string union literal array type, disallow any redundant values from existing in the array
[英]TypeScript array to string literal type
我目前有一个字符串数组和一个包含相同字符串的字符串文字联合类型:
const furniture = ['chair', 'table', 'lamp'];
type Furniture = 'chair' | 'table' | 'lamp';
我的应用程序中需要两者,但我试图保持我的代码干燥。 那么有没有办法从另一个中推断出一个?
我基本上想说的是type Furniture = [any string in furniture array]
,所以没有重复的字符串。
通过使用通用的 rest 参数,有一种方法可以将string[]
正确推断为文字元组类型,然后获取文字的联合类型。
它是这样的:
const tuple = <T extends string[]>(...args: T) => args;
const furniture = tuple('chair', 'table', 'lamp');
type Furniture = typeof furniture[number];
TypeScript 3.4 版引入了所谓的const contexts ,这是一种将元组类型声明为不可变并直接获取窄文字类型的方法(无需调用如上所示的函数)。
使用这个新语法,我们得到了这个很好的简洁解决方案:
const furniture = ['chair', 'table', 'lamp'] as const;
type Furniture = typeof furniture[number];
最好的解决方法:
const furnitureObj = { chair: 1, table: 1, lamp: 1 };
type Furniture = keyof typeof furnitureObj;
const furniture = Object.keys(furnitureObj) as Furniture[];
理想情况下,我们可以这样做:
const furniture = ['chair', 'table', 'lamp'];
type Furniture = typeof furniture[number];
不幸的是,今天furniture
被推断为string[]
,这意味着Furniture
现在也是string
。
我们可以使用手动注释将类型强制为文字,但它会带回重复:
const furniture = ["chair", "table", "lamp"] as ["chair", "table", "lamp"];
type Furniture = typeof furniture[number];
TypeScript问题 #10195跟踪向 TypeScript 提示列表应该被推断为静态元组而不是string[]
,所以也许在未来这将成为可能。
typescript 3.4 中最简单的:(注意 TypeScript 3.4 添加了const 断言)
const furniture = ["chair", "table", "lamp"] as const;
type Furniture = typeof furniture[number]; // "chair" | "table" | "lamp"
另见https://stackoverflow.com/a/55505556/4481226
或者,如果您将这些作为对象中的键,您也可以将其转换为联合:
const furniture = {chair:{}, table:{}, lamp:{}} as const;
type Furniture = keyof typeof furniture; // "chair" | "table" | "lamp"
我建议的唯一调整是使const
保证与类型兼容,如下所示:
type Furniture = 'chair' | 'table' | 'lamp';
const furniture: Furniture[] = ['chair', 'table', 'lamp'];
如果您在数组中出现拼写错误或添加未知项目,这将向您发出警告:
// Warning: Type 'unknown' is not assignable to furniture
const furniture: Furniture[] = ['chair', 'table', 'lamp', 'unknown'];
这对您没有帮助的唯一情况是数组不包含其中一个值。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.