如何将字符串文字类型定义为另一个字符串文字类型的子类型?

2023-12-24

如何创建一个字符串文字类型作为另一个字符串文字类型的子类型?

或者换句话说,如何从字符串文字类型中选取值来创建新类型?

Example:

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 https://www.typescriptlang.org/docs/handbook/utility-types.html#picktype-keys仅在选择(对象)属性键时有效。


而不是Pick, 你可以Extract https://www.typescriptlang.org/docs/handbook/utility-types.html#extracttype-union。在这种情况下,使用字符串文字,它不会让你比&, 尽管。

type Fish = Extract<Animal, 'goldfish' | 'lion'>   // 'goldfish'
type Fish2 = Animal & ('goldfish' | 'lion')        // 'goldfish'

在这两种情况下,请注意,如果您尝试选择不属于原始集的条目,则不会出现编译时错误;它将被简单地省略。和通用约束 https://www.typescriptlang.org/docs/handbook/2/generics.html#generic-constraints (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'

游乐场链接 https://www.typescriptlang.org/play?#code/C4TwDgpgBAggdgSwLYEMA2UC8UDkBzAezQBMAzBAZwAscoAfXYAVzhVoZwjQjCpTmA4AUENCQoAMUpUsUAKIAPYACcUAY2AAeeMnQAaXIRLlq7XGgQE4OAHyjw0KdQBMsnagwAyKAAp8RMmkzHAsrHABKETFoAGUmACMKCC0AaQMAFSgIJQg4YgooFJtZdIBuKIdJaQBmWTjE5O1EDwN-YyD6c0trG3LoquoAFjqEpK13fUMAkxpOnGZWW1KgA

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将字符串文字类型定义为另一个字符串文字类型的子类型? 的相关文章

随机推荐