TypeScript中的类型

时间:2018-07-22 13:43:22

标签: typescript

我在条件类型的图示中看到了这个例子:

type IsNumberType<T> = T extends number ? "yes" : "no";

type Yes = IsNumberType<3>; // type "yes"
type No = IsNumberType<"foo">; // type "no"

为什么"yes"是一种类型?是值还是字符串文字?

3 个答案:

答案 0 :(得分:0)

这些被称为String Literal Types,这里是文档中的描述:

  

字符串文字类型允许您指定字符串必须具有的确切值。在实践中,字符串文字类型与联合类型,类型保护和类型别名很好地结合在一起。您可以将这些功能一起使用,以获得类似于字符串的枚举行为。

source

答案 1 :(得分:0)

Typescript具有literal type的概念。任何常量aka文字,都可以用作类型:

    let foo:'foo' = 'foo'

变量foo的唯一有效值是文字字符串'foo'。就其本身而言,它们不一定有用,但是将它们与一个联合放在一起,您将获得一个变量,该变量具有一组有限的可能值。

 let fooBar : 'foo' |'bar' = 'bar'

将它们与接口的并集放在一起,您将得到discriminated unions

字符串文字类型也用于映射类型,并且keyof还返回表示类型键的字符串文字类型的并集。

一旦您知道了,它们就会变得非常有用:-)

答案 2 :(得分:0)

String literals以及数字文字也可以是类型。如果您只想允许一个字符串或一组特定的字符串,而不是任何任意字符串,这将很有用。

例如,在CSS中,flexbox align-items属性仅采用某些值,包括'flex-start''center'。它不需要任何任意值。这样,您可以通过指定可用于align-items属性的字符串来增加类型安全性。

type Styles = { alignItems?: 'center' | 'flex-start' };
const styles: Styles = {};
styles.alignItems = 'cente';  // error
styles.alignItems = 'center'; // ok

这比使用枚举要简单得多,在枚举中您必须使用类似styles.alignItems = AlignItemStyles.Center之类的东西,但仍然提供相同数量的类型安全性。