这是我的水果。ts
export type Fruit = "Orange" | "Apple" | "Banana"
现在我在进口水果。Ts在另一个typescript文件中。这是我有的
myString:string = "Banana";
myFruit:Fruit = myString;
当我这样做的时候
myFruit = myString;
我得到一个错误:
类型“string”不能赋值给类型“Orange”|“Apple”|
“香蕉”
如何将字符串分配给自定义类型水果的变量?
Typescript 3.4引入了新的'const'断言
您现在可以防止文字类型(例如。'橙色'或'红色')被“拓宽”为使用所谓的const断言的类型字符串。
你将能够做到:
let fruit = 'orange' as const; // or...
let fruit = <const> 'orange';
然后它就不会再变成字符串了,这就是问题的根源。
你也可以在整个对象上这样做:
let animals = [ { species: 'dog' }, { species: 'cat' } ] as const;
type firstAnimal = (typeof animals)[0]['species']; // string literal 'dog'
额外提示:你也可以使用<const> false或<const> true来表示一个必须为真或假的布尔值。这在有歧视的工会中有时是有用的。你一看到就知道了。
当你这样做的时候:
export type Fruit = "Orange" | "Apple" | "Banana"
…你正在创建一个名为Fruit的类型,它只能包含字面意义上的“Orange”、“Apple”和“Banana”。这种类型扩展了String,因此可以将它赋值给String。但是,String没有扩展"Orange" | "Apple" | "Banana",所以不能分配给它。String不太具体。它可以是任何字符串。
当你这样做的时候:
export type Fruit = "Orange" | "Apple" | "Banana"
const myString = "Banana";
const myFruit: Fruit = myString;
...它的工作原理。为什么?因为在这个例子中myString的实际类型是“Banana”。是的,“香蕉”就是那种类型。它是extends String,所以它是可赋值给String的。此外,当一个类型扩展Union type的任何组件时,它也扩展了Union type。在本例中,类型“Banana”扩展了“Orange”|“Apple”|“Banana”,因为它扩展了它的一个组件。因此,“香蕉”可分配给“橙子”|“苹果”|“香蕉”或水果。