是否可以创建一个带有值的Type
。
例如:
type Animal = {
kind : "animal"
Legs : number,
CanFly: boolean
}
const monkey: Animal = { Legs: 4, CanFly: false}; //In this line, clients has to initialize the same value `kind : "animal"`
我将创建一个称为kind的属性,并使用该属性来推断对象并做出决定。 但是,在下一行中,我希望客户端在所有初始化中都传递相同的值。否则,TS编译器会抱怨“类型中缺少属性'种类'。
是否有一种默认方法,而无需客户端将其传递回去?
答案 0 :(得分:1)
TypeScript是一种结构化类型的语言。这意味着在定义type
或interface
时,您定义了其他对象必须遵循的形状。并且无法在TS类型中分配默认值。
type Animal = {
kind : "animal"
Legs : number,
CanFly: boolean
}
我假定您使用的是TS的最新版本,因为您的kind
是字符串文字类型“ animal”,并且只能是该字符串文字。创建kind: "animal"
形状的对象时,您必须提供Animal
。
现在,如果要实现有区别的联合,则可以选择以下方法(在这种情况下,动物也许有点通用):
type Snake = {
kind: "snake"
Legs : number,
CanFly: boolean
}
type Dolphin = {
kind: "dolphin",
Legs: number,
CanFly: boolean
}
type Monkey = {
kind: "monkey",
Legs: number,
CanFly: boolean
}
然后是一个有区别的工会:
type Animal = Snake | Dolphin | Monkey
重申一下,TS在类型声明中不支持默认值。 TS类型定义事物的形状,如果对象 O 不符合形状 T ,那么 O 则不一个 T 。
答案 1 :(得分:1)
好吧,您使用类而不是对象文字:
export interface Animal {
kind: string;
Legs : number;
CanFly: boolean;
}
export class AnimalDto implements Animal {
kind: string;
Legs : number;
CanFly: boolean;
public constructor (animal?: Animal) {
this.kind = animal.kind || "default value";
this.Legs= animal.Legs || -1;
this.CanFly = animal.CanFly || false;
}
}
const dog = new AnimalDto();
const cat = new AnimalDto({kind: "domestic", Legs: 4, CanFly: false});
答案 2 :(得分:1)
您可以创建工厂方法:
type Animal = {
kind : "animal"
Legs : number,
CanFly: boolean
}
function createAnimal(parameter: Omit<Animal, 'kind'>): Animal {
return {
kind: 'animal',
...parameter,
};
}
const monkey = createAnimal({ Legs: 4, CanFly: false});