关于TypeScript 中函数重载的工作原理有很多问题(例如,TypeScript 函数重载)。但是没有像“为什么它以这种方式工作?”这样的问题。现在函数重载看起来像这样:
function foo(param1: number): void;
function foo(param1: number, param2: string): void;
function foo(...args: any[]): void {
if (args.length === 1 && typeof args[0] === 'number') {
// implementation 1
} else if (args.length === 2 && typeof args[0] === 'number' && typeof args[1] === 'string') {
// implementation 2
} else {
// error: unknown signature
}
}
Run Code Online (Sandbox Code Playgroud)
我的意思是,Typescript 的创建是为了通过添加一些所谓的“语法糖”来使程序员的生活更轻松,从而提供 OOD 的优势。那么为什么 Typescript 不能代替程序员来做这些烦人的事情呢?例如,它可能看起来像:
function foo(param1: number): void {
// implementation 1
};
function …Run Code Online (Sandbox Code Playgroud) 我正在尝试在类方法上应用打字稿的方法重载,以用于过滤器类方法。
class Vector<T> {
static of<T>(vals: T[]): Vector<T> {
return undefined;
}
// filter<U extends T>(fn:(x:T)=>x is U): Vector<U>;
filter(fn:(x:T)=>boolean): this {
return undefined;
}
}
const v1 = Vector.of([1,2,3]).filter(x=>x>1);
Run Code Online (Sandbox Code Playgroud)
这工作正常,直到注释行被取消注释。
当取消注释该行时,我们收到错误:
ttt.ts(12,38): error TS2345: Argument of type '(x: number) => boolean' is not assignable to parameter of type '(x: number) => x is number'.
Signature '(x: number): boolean' must be a type predicate.
Run Code Online (Sandbox Code Playgroud)
所以看来 typescript (2.7.2) 忽略了重载并仅选择 的类型定义之一filter,我不明白。这种重载模式filter是相对已知的,并且由 typescript 自己的 es5.d.ts 使用,此外类也支持 …