从参数失败推断出的三元 return 类型(打字稿)
Ternary return type inferred from parameter failure (Typescript)
经过长时间阅读问题和查看文档后,我仍然需要帮助。
我的问题很简单。我想定义一个函数,当一个数组作为参数给出时,它 return 是一个数组,但 Typescript 从不让我 return 想要的值。
我在这里简化了我想编写的函数,因为错误仍然存在。
function notWorkingTernary(val: number | number[]) : typeof val extends number[] ? string[] : string{
if(Array.isArray(val)){
return val.map(v=>String(v));
}
else{
return String(val);
}
}
此函数在第一个 return(第 3 行)出现以下错误:
Type 'string[]' is not assignable to type 'string'.ts(2322)
我不明白为什么 Typescript 要我 return 一个字符串类型,即使这里的 val 类型显然是一个数字数组。
如果我避免给出 return 类型,那么 return 类型总是字符串 | string[] 并且我每次使用该函数时都必须自己输入 return。
我做错了什么?
您想使用 function signature overloading。在您的情况下,它应该如下所示:
function notWorkingTernary(val: number): string;
function notWorkingTernary(val: number[]): string[];
function notWorkingTernary(val: number | number[]): (string | string[]) {
if(Array.isArray(val)){
return val.map(v=>String(v));
}
else{
return String(val);
}
}
基本上,您有一个函数具有多个“类型重载”,这些“类型重载”在运行时处理,并且通过声明类型您保证运行时与类型兼容。
function notWorkingTernary<T extends number | number[]>(val: T): T extends number[] ? string[] : string{
if(Array.isArray(val)){
return val.map(v=>String(v)) as T extends number[] ? string[] : string;
}
else{
return String(val) as T extends number[] ? string[] : string;
}
}
也许有人知道摆脱 as T extends number[] ? string[] : string
的聪明方法?
经过长时间阅读问题和查看文档后,我仍然需要帮助。 我的问题很简单。我想定义一个函数,当一个数组作为参数给出时,它 return 是一个数组,但 Typescript 从不让我 return 想要的值。
我在这里简化了我想编写的函数,因为错误仍然存在。
function notWorkingTernary(val: number | number[]) : typeof val extends number[] ? string[] : string{
if(Array.isArray(val)){
return val.map(v=>String(v));
}
else{
return String(val);
}
}
此函数在第一个 return(第 3 行)出现以下错误:
Type 'string[]' is not assignable to type 'string'.ts(2322)
我不明白为什么 Typescript 要我 return 一个字符串类型,即使这里的 val 类型显然是一个数字数组。
如果我避免给出 return 类型,那么 return 类型总是字符串 | string[] 并且我每次使用该函数时都必须自己输入 return。
我做错了什么?
您想使用 function signature overloading。在您的情况下,它应该如下所示:
function notWorkingTernary(val: number): string;
function notWorkingTernary(val: number[]): string[];
function notWorkingTernary(val: number | number[]): (string | string[]) {
if(Array.isArray(val)){
return val.map(v=>String(v));
}
else{
return String(val);
}
}
基本上,您有一个函数具有多个“类型重载”,这些“类型重载”在运行时处理,并且通过声明类型您保证运行时与类型兼容。
function notWorkingTernary<T extends number | number[]>(val: T): T extends number[] ? string[] : string{
if(Array.isArray(val)){
return val.map(v=>String(v)) as T extends number[] ? string[] : string;
}
else{
return String(val) as T extends number[] ? string[] : string;
}
}
也许有人知道摆脱 as T extends number[] ? string[] : string
的聪明方法?