【问题标题】:Typescript arrow functions overloads error 2322Typescript 箭头函数重载错误 2322
【发布时间】:2022-12-02 21:48:35
【问题描述】:
下面的代码工作正常,但它给出了 resolve 常量的错误。
const resolve: Resolve
Type '(param: "case 1" | "case 2" | "case 3") => boolean | "string" | 1000' is not assignable to type 'Resolve'.(2322)
// Overloads
type Resolve = {
(): false;
(param: 'case 1'): string;
(param: 'case 2'): number;
(param: 'case 3'): true;
};
const resolve: Resolve = (param) => {
switch (param) {
case 'case 1':
return 'string';
case 'case 2':
return 1000;
case 'case 3':
return true;
default:
return false;
}
};
const result = {
first: resolve('case 1'),
second: resolve('case 2'),
third: resolve('case 3'),
none: resolve()
};
知道如何解决吗?
【问题讨论】:
标签:
typescript
function
arrow-functions
constructor-overloading
【解决方案1】:
通常情况下,重载函数的实现签名与重载签名不完全兼容。当您使用重载语法时,TypeScript 对此相当放松。
在您的情况下,由于您没有使用重载语法,因此您必须使用类型断言(在当然该函数对于重载的行为是否正确):
const resolve = ((param?: "case 1" | "case 2" | "case 3"): string | number | true | false => {
switch (param) {
case "case 1":
return "string";
case "case 2":
return 1000;
case "case 3":
return true;
default:
return false;
}
}) as Resolve;
(我还为 param 添加了一个类型注释和一个返回类型注释,只是为了更好的衡量,尽管在实现签名中真正松散的情况并不少见。)
Playground example
仅 FWIW,改用函数重载语法 (playground link):
function resolve(param: "case 1"): string;
function resolve(param: "case 2"): number;
function resolve(param: "case 3"): true;
function resolve(): false;
function resolve(param?: "case 1" | "case 2" | "case 3"): string | number | true | false {
switch (param) {
case "case 1":
return "string";
case "case 2":
return 1000;
case "case 3":
return true;
default:
return false;
}
};
type Resolve = typeof resolve;
...但这并不总是可能的,在没有实际实现它的情况下必须定义类型的情况并不少见(例如,在 API 的回调类型中)。