如何阻止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();
上述工作的原因是Man
和Woman
类型的属性和方法类似。如果我为Man
或Woman
添加了一些唯一的属性或方法,则会按预期抛出错误。
如果有人为与其他类型声明的变量分配了不同的类型,那么如何让TypeScript抛出错误?
答案 0 :(得分:5)
这是设计使然,如果类型匹配,TypeScript不会抛出错误。
TypeScript的核心原则之一是类型检查侧重于“#shape”形状。价值观。这有时被称为"鸭子打字"或"结构子类型"。
因此,这是在运行时检查的内容。
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