鉴于以下情况:
interface Foo {
attr: string;
(a: string): number;
(a: number): number;
}
Run Code Online (Sandbox Code Playgroud)
如何创建一种仅选择函数重载的类型,这意味着:
interface Bar {
(a: string): number;
(a: number): number;
}
Run Code Online (Sandbox Code Playgroud)
当只有一个呼叫签名时,我找到了解决方案,我的情况是当有多个呼叫签名时。
谢谢
给出的类型ReturnType似乎取决于重载签名的写入顺序
function applyChanges1(input: string): number
function applyChanges1(input: number): string
function applyChanges1(input: number | string): number | string {
return typeof input === "number" ? input.toString() : input.length
}
function applyChanges2(input: number): string
function applyChanges2(input: string): number
function applyChanges2(input: number | string): number | string {
return typeof input === "number" ? input.toString() : input.length
}
type Ret1 = ReturnType<typeof applyChanges1> // string
type Ret2 = ReturnType<typeof applyChanges2> // number
Run Code Online (Sandbox Code Playgroud)
似乎采用了最后一个重载签名的返回类型,这似乎很随意。我期待Ret1和Ret2都会string | number。有这种行为的原因吗?
我有一个 Typescript 项目,我在Date函数内部调用。我想使用与从中Date重载的构造函数相同的函数参数:
interface DateConstructor {
new(): Date;
new(value: number | string | Date): Date;
new(year: number, month: number, date?: number, hours?: number, minutes?: number, seconds?: number, ms?: number): Date;
// ...
}
Run Code Online (Sandbox Code Playgroud)
我想使用扩展运算符将参数传递给Date. 所以我的函数应该是这样的:
function myFn(...args: DateComponents): Date {
return new Date(...args)
}
Run Code Online (Sandbox Code Playgroud)
在我的情况下,我实际上并没有返回日期,但这仅用于测试...
现在的问题是如何定义DateComponents. 我成功地分别实现了 3 个重载签名DateConstructor。
// Case A: No argument provided
interface A {
(): Date;
}
const a: A = function (...args: []): Date { …Run Code Online (Sandbox Code Playgroud) typescript ×3