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

标签 typescript

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

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

例子:

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'

在这两种情况下,请注意,如果您尝试选择不属于原始集合的条目,则不会出现编译时错误;它将被简单地省略。用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'

Playground Link

关于typescript - 如何将字符串文字类型定义为另一种字符串文字类型的子类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67628495/

相关文章:

javascript - 如果不是未定义的,如何从多个对象中删除属性?

javascript - Angular2 : Directive variable change, 更新元素

angular - CodeMirror 作为 Angular2 组件

angular - ESlint 和 Angular 13 : Unable to turn off typescript-eslint/typedef

javascript - 如何在 tsc 从 .js 文件生成的类型定义中包含继承的属性?

typescript - 在 typescript 中 Jest mock express 和 Mongoose

javascript - 如何在 Typescript 单元测试中模拟鼠标拖动?

node.js - HTTP2 的 Express 类型

javascript - 对 JSX.Element 与 React.Component 之间的差异以及何时将它们与 React-dom-router 一起使用感到困惑

javascript - 保存下拉菜单中最后选择的选项