我在条件类型的图示中看到了这个例子:
type IsNumberType<T> = T extends number ? "yes" : "no";
type Yes = IsNumberType<3>; // type "yes"
type No = IsNumberType<"foo">; // type "no"
为什么"yes"
是一种类型?是值还是字符串文字?
答案 0 :(得分:0)
这些被称为String Literal Types,这里是文档中的描述:
字符串文字类型允许您指定字符串必须具有的确切值。在实践中,字符串文字类型与联合类型,类型保护和类型别名很好地结合在一起。您可以将这些功能一起使用,以获得类似于字符串的枚举行为。
答案 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
之类的东西,但仍然提供相同数量的类型安全性。