typescript - 基于类类型的打字稿返回类型
问题描述
我用 Typescript 设置了以下类:
abstract class BaseClass {
id: string | number;
getIdPlusOne() {
if (typeof this.id === 'number') {
return this.id + 1;
}
return this.id + '1';
}
}
class User extends BaseClass {
id: number;
}
class Book extends BaseClass {
id: string;
}
现在,显然调用getIdPlusOne
一个User
实例会返回一个数字,而调用一个Book
实例会返回一个字符串。但是 Typescript 不知道,因为函数本身返回string | number
有没有办法让编译器知道new User().getIdPlusOne()
总是返回一个数字?
解决方案
我认为您的困惑可以通过一些面向对象的编程多态性来解决。
你想要什么是可能的,你只需要以另一种方式声明你的类:
abstract class BaseClass {
abstract getIdPlusOne(): string | number;
}
class User extends BaseClass {
id: number;
constructor(id: number) {
super();
this.id = id;
}
getIdPlusOne(): number {
return this.id;
}
}
class Book extends BaseClass {
id: string;
constructor(id: string) {
super();
this.id = id;
}
getIdPlusOne(): string {
return this.id
}
}
console.log(new User(1).getIdPlusOne())
console.log(typeof new User(1).getIdPlusOne())
console.log(new Book("1").getIdPlusOne())
console.log(typeof new Book("1").getIdPlusOne())
你可以尝试检查一下这个stackblitz
如果这对你有帮助。我的建议是将你的抽象类变成一个接口:
interface BaseClass {
getIdPlusOne(): string | number;
}
并在您的其他类中实现该接口
推荐阅读
- javascript - 如何更新 b-modal Vue 中的数据/观察数组长度的变化并更新?
- javascript - 加载外部js文件window.onload时无法读取null的属性“querySelectorAll”
- flutter - 构建 iOS 失败 - Flutter
- javascript - 如何根据出生日期计算两个日期之间的差异
- python - FastAPI 和 Pydantic RecursionError 在 ASGI 应用程序中导致异常
- reactjs - 无法创建反应应用程序:每当我运行命令时终端就会卡住
- postgresql - clojure jdbc & postgres:创建视图时无法确定参数 $1 的数据类型
- python - 将 TypeVar 上限设置为之后定义的类
- jquery - 如何在 AMP 上实现 Jquery?
- hana - 如何刷新HANA中的所有虚拟表?