首页 > 解决方案 > 基于类类型的打字稿返回类型

问题描述

我用 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()总是返回一个数字?

标签: typescript

解决方案


我认为您的困惑可以通过一些面向对象的编程多态性来解决。

你想要什么是可能的,你只需要以另一种方式声明你的类:

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

并在您的其他类中实现该接口


推荐阅读