打字稿使用初始/默认值初始化类型

时间:2020-05-10 18:33:59

标签: typescript

是否可以创建一个带有值的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编译器会抱怨“类型中缺少属性'种类'。

是否有一种默认方法,而无需客户端将其传递回去?

3 个答案:

答案 0 :(得分:1)

TypeScript是一种结构化类型的语言。这意味着在定义typeinterface时,您定义了其他对象必须遵循的形状。并且无法在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});