gpt4 book ai didi

typescript - 如何防止分配相似的类型?

转载 作者:搜寻专家 更新时间:2023-10-30 21:20:33 26 4
gpt4 key购买 nike

如何防止 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 抛出错误?

最佳答案

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

One of TypeScript's core principles is that type-checking focuses on the 'shape' that values have. This is sometimes called "duck typing" or "structural subtyping".

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

关于typescript - 如何防止分配相似的类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32680394/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com