我试图通过将函数设置为联合函数类型来“重载”一个函数,以便给定参数的类型设置返回对象中成员data
的类型。但这会引发错误:
type FN1 = (a: string) => {data: string};
type FN2 = (b: number) => {data: number};
const fn: FN1 | FN2 = c => ({data: c});
fn('some string');
^^^^^^^^^^^^^ <= Argument of type 'string' is not assignable to parameter of type 'never'.
fn
的类型显示为
const fn: (arg0: never) => {data: string} | {data: number}
为什么参数类型为never
?还有其他方法使之成为可能吗?
答案 0 :(得分:1)
这对于泛型来说是一个很好的例子,因为可以从输入类型轻松键入返回类型。
对于任何值:
const fn = <T>(c: T): {data: T} => ({data: c});
仅适用于字符串和数字:
const fn = <T extends string | number>(c: T): {data: T} => ({data: c});
答案 1 :(得分:0)
为您的需要,我只使用一个通用函数:
function fn1<T>(data: T) {
return { data };
}
当然也可以通过函数重载来解决(注意:这在您的代码sanbox中将不起作用,因为eslint在重新声明该函数时出错,但在typescript中有效,在eslint中是错误):< / p>
function fn1(data:string): {data: string};
function fn1(data:number): {data: number};
function fn1(data: any): any {
return {data};
}
fn1("some string");
fn1(1);