【问题标题】:how to achieve overload in typescript如何在打字稿中实现重载
【发布时间】:2020-12-14 03:55:55
【问题描述】:

我知道打字稿中有这样的方法:

function foo(arg: number): string;
function foo(arg: string): number;
function foo(): any {
  if (typeof arguments[0] === "string") {
    return +arguments[0];
  } else {
    return arguments[0].toString();
  }
}

foo(1)       // '1'
foo("hello") // NaN 
foo("2")     // 2

但是当我有相同数量的参数并且每个参数都是自定义类型时,像这样


interface Dog {
  run: number;
}

interface Bird {
  fly: number;
}

function foo(arg: Dog): number;
function foo(arg: Bird): number;
function foo(): any {
}


如何分辨这些参数之间的区别

【问题讨论】:

  • 通过检查arg.runarg.fly是否存在。

标签: typescript overloading


【解决方案1】:

TypeScript 是 JavaScript,所以你基本上必须做同样的事情。为了让你的编译器满意,你可以实现类型保护。

https://www.typescriptlang.org/docs/handbook/advanced-types.html#user-defined-type-guards

function isDog(pet: Dog | Bird): pet is Dog {
  return 'run' in pet
}

你可以在你的代码中使用这些来告诉 TypeScript 你已经验证了运行时的类型。

function foo(arg?: Dog | Bird): void | number {
  if(arg) {
    if(isDog(arg)) {
      return arg.run;
    } else {
      return arg.fly;
    }
  }
}

【讨论】:

  • 附注:return 'run' in pet; 也可以,并且更简洁且(主观上)语义正确。
  • 是的,我只是从 TypeScript 的文档中复制了示例并将 fish 更改为 dog。
猜你喜欢
  • 2019-01-24
  • 2023-03-03
  • 2023-04-10
  • 2017-02-03
  • 1970-01-01
  • 2019-02-10
  • 2015-06-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多