【问题标题】:TypeScript inheritance type of functionsTypeScript 继承类型的函数
【发布时间】:2018-12-14 03:31:07
【问题描述】:

我已经开始学习 TypeScript,我有一个关于函数或参数的问题。是否有必要使用我们在类中扩展其他类的类型的参数,如下所示?或者我们可以只使用哪种类型的函数是移动的,即它是无效的,并且在从该类继承的类中做不同的事情?

class Animal {
    name: string;
    constructor(_name: string) {
        this.name = _name;
    }

    move(dinstanceInMeters: number = 0): void {
        console.log(`${this.name} moved ${dinstanceInMeters}m.`);
    }
}

class Snake extends Animal {
    constructor(_name: string) {
        super(_name);
    }

    move(dinstanceInMeters: number = 5): void {
        console.log(`Slithering...`);
        super.move(dinstanceInMeters);
    }
}

【问题讨论】:

  • “必要”不是正确的词。如果你说父构造函数参数应该是一个字符串,它可以是string,也可以是any。如果您不声明它应该工作的类型,因为它将被标记为“任何”,尽管与父签名相比,拥有具有不同签名的子签名并没有多大意义。其他的也一样。

标签: typescript


【解决方案1】:

我将把我的答案分为 Can DoCan't Do,如下所示:

可以做

  1. 您可以将派生类 (Snake) 参数类型更改为 any,有或没有初始化值,如下所示:

    move(dinstanceInMeters: any = '5'): void {move(dinstanceInMeters: any): void {

  2. 您可以将派生类 (Snake) 的返回值更改为您想要的任何值,如下所示: move(dinstanceInMeters: any = '5'): string {

    (参见下面 DEMO 中的Snake 类可以做的 1 和 2。)

做不到

  1. 不能将派生类 (Snake) 参数类型更改为 any 以外的其他类型,如下所示: move(dinstanceInMeters: string = '5'): void {

    你会得到的编译时错误:

    'Snake' 类型中的属性 'move' 不能分配给基本类型 'Animal' 中的相同属性。 类型 '(dinstanceInMeters?: string) => string' 不可分配给类型 '(dinstanceInMeters?: number) => void'。 参数 'dinstanceInMeters' 和 'dinstanceInMeters' 的类型不兼容。 类型“数字”不可分配给类型“字符串”。 (方法) Sname.move(dinstanceInMeters?: string): string

    (参见下面 DEMO 中的Dog 类。)

  2. 您不能向派生类 (Snake) 移动函数添加另一个参数,如下所示: move(dinstanceInMeters: number = 5, anotherParam: any): void {

    你会得到的编译时错误:

    'Snake' 类型中的属性 'move' 不能分配给基本类型 'Animal' 中的相同属性。 类型 '(dinstanceInMeters: number, anotherParam: any) => string' 不可分配给类型 '(dinstanceInMeters?: number) => void'。 (方法) Snake.move(dinstanceInMeters: number, anotherParam: any): string

    (参见下面 DEMO 中的Cat 类。)

在您的代码中添加了 StackBlitz DEMO project 以查看它的实际效果。

【讨论】:

  • 感谢您的回答,并为此向我解释。
猜你喜欢
  • 2020-01-05
  • 1970-01-01
  • 1970-01-01
  • 2017-03-18
  • 2016-05-16
  • 1970-01-01
  • 1970-01-01
  • 2017-06-30
  • 1970-01-01
相关资源
最近更新 更多