如何将字符串文字类型定义为另一种字符串文字类型的子类型?
如何将字符串文字类型创建为另一种字符串文字类型的子类型?
或者换句话说,如何从字符串文字类型中选择值来创建新类型?
例子:
type Animal = 'goldfish' | 'tuna' | 'elephant'
// I would like to use Pick:
type Fish = Pick<Animal, 'goldfish', 'tuna'>
// So that the desired result is: 'goldfish | 'tuna'
但是,这不起作用,因为Pick仅在选择(对象)属性键时有效。
回答
而不是Pick,你可以Extract。在这种情况下,对于字符串文字,它不会比 更进一步&。
type Fish = Extract<Animal, 'goldfish' | 'lion'> // 'goldfish'
type Fish2 = Animal & ('goldfish' | 'lion') // 'goldfish'
在这两种情况下,请注意,如果您尝试选择不属于原始集合的条目,则不会出现编译时错误;它将被简单地省略。使用泛型约束( extends),您可以编写自己的Subset类型来实现这一点。
type Subset<K, T extends K> = T;
type Fish3 = Subset<Animal, 'goldfish' | 'lion'>; // compile error
type Fish4 = Subset<Animal, 'goldfish' | 'tuna'>; // 'goldfish' | 'tuna'
游乐场链接