我目前有一个字符串数组和一个包含相同字符串的字符串文字联合类型:
const furniture = ['chair', 'table', 'lamp'];
type Furniture = 'chair' | 'table' | 'lamp';
我在我的应用程序中需要这两个,但我试图保持我的代码DRY。那么有没有办法从另一个推断出一个?
我基本上想说type Furniture = [any string in furniture array]
之类的东西,所以没有重复的字符串。
答案 0 :(得分:19)
使用通用的rest参数,有一种方法可以正确地将nlp.stanford.edu
推断为文字元组类型,然后获取文字的并集类型。
它是这样的:
string[]
More about generic rest parameters
TypeScript 3.4版引入了所谓的 const上下文,这是一种将元组类型声明为不可变并直接获取窄文字类型的方法(无需调用如上所示的函数) )。
使用这种新语法,我们得到了一个很好的简洁解决方案:
const tuple = <T extends string[]>(...args: T) => args;
const furniture = tuple('chair', 'table', 'lamp');
type Furniture = typeof furniture[number];
More about the new const contexts is found in this PR以及release notes中。
答案 1 :(得分:9)
最佳解决方法:
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 issue #10195跟踪提示TypeScript的能力,列表应该被推断为静态元组,而不是string[]
,所以将来可能会这样。
答案 2 :(得分:-1)
我建议的唯一调整是使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'];
唯一无法帮助您的情况是数组中没有包含其中一个值。