如何防止类似的类型?

时间:2015-09-20 14:19:26

标签: typescript

如何阻止TypeScript允许将类似但不同的类型分配给声明的变量?

考虑以下课程:

class Person {
 private firstName;
 private lastName;

 public setFirstName(firstName: string): void {
  this.firstName = firstName;
 }

 public setLastName(lastName: string): void {
  this.lastName = lastName;
 }

 public getFullName(): string {
  return this.firstName + ' ' + this.lastName;
 }
}

class Man extends Person {
 public getFullName(): string {
  return 'Mr. ' + super.getFullName();
 }
}

class Woman extends Person {
 public getFullName(): string {
  return 'Ms. ' + super.getFullName();
 }
}

以下作品:

var jon: Man = new Woman();
var arya: Woman = new Man();

上述工作的原因是ManWoman类型的属性和方法类似。如果我为ManWoman添加了一些唯一的属性或方法,则会按预期抛出错误。

如果有人为与其他类型声明的变量分配了不同的类型,那么如何让TypeScript抛出错误?

2 个答案:

答案 0 :(得分:5)

这是设计使然,如果类型匹配,TypeScript不会抛出错误。

  

TypeScript的核心原则之一是类型检查侧重于“#shape”形状。价值观。这有时被称为"鸭子打字"或"结构子类型"。

     

http://www.typescriptlang.org/Handbook#interfaces

因此,这是在运行时检查的内容。

var arya: Woman = new Man();

if (arya instanceof Man) {
    throw new Error("Dude looks like a lady! *guitar riff*");
}

TypeScript理解instanceof,因此它也可用于投射类型。

var jon: Man = new Woman();

if (jon instanceof Man) {
    // The type of `jon` is Man
    jon.getFullName();
}

if (jon instanceof Woman) {
    // The type of `jon` is Woman
    jon.getFullName();
}

最后,您还可以使用1.6中提供的类型保护。

function isMan(a: Person): a is Man {
    return a.getFullName().indexOf('Mr. ') !== -1;
}

var arya: Woman = new Man();

if(isMan(arya)) {
    // The type of `arya` is Man
    arya.getFullName();
}

答案 1 :(得分:0)

所以它按设计工作(你不能逃避它)。从官方文档:

类与对象文字类型和接口的工作方式类似,只有一个例外:它们同时具有静态和实例类型。比较类类型的两个对象时,仅比较实例的成员。静态成员和构造函数不会影响兼容性。

class Animal {
    feet: number;
    constructor(name: string, numFeet: number) { }
}

class Size {
    feet: number;
    constructor(numFeet: number) { }
}

var a: Animal;
var s: Size;

a = s;  //OK
s = a;  //OK