【问题标题】:How to prevent assiging similar types?如何防止分配相似的类型?
【发布时间】:2015-09-20 14:19:25
【问题描述】:

如何防止 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 独有的一些属性或方法,它将按预期抛出错误。

如果有人将具有相似签名的不同 types 分配给为另一个 type 声明的变量,我如何让 TypeScript 抛出错误?

【问题讨论】:

标签: typescript


【解决方案1】:

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

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

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();
}

【讨论】:

  • 同意,它们的实现不同,但类型相同。
【解决方案2】:

所以它是按设计工作的(你无法逃避它)。来自官方文档:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多