联合类型功能“重载”不起作用

时间:2020-10-08 07:13:03

标签: typescript typescript-typings typescript-generics

我试图通过将函数设置为联合函数类型来“重载”一个函数,以便给定参数的类型设置返回对象中成员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?还有其他方法使之成为可能吗?

SandBox Link

2 个答案:

答案 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);
相关问题