如何在打字稿中导出重载函数

Ari*_*zer 10 typescript

我有一个想要重载的函数,以便它arg2根据 的值arg1(有一个已知值列表)知道 的类型。

一个非常粗略的例子来演示我正在尝试做的事情:

interface CatArgs {legs : number}

interface FishArgs {fins: number}

type CarOrFishArgs = CatArgs | FishArgs;
type Animal = Cat | Fish;

type Type = 'Cat' | 'Fish';

class Cat{
    constructor(args:CatArgs){}
}

class Fish {
    constructor(args:FishArgs){}
}

export declare function getAnimal(type:'Cat', args:CatArgs): Cat;
export declare function getAnimal(type:'Fish', args:FishArgs): Fish;

export function getAnimal(type:Type, args:CarOrFishArgs): Animal {
    switch (type) {
        case 'Cat':
            return new Cat(args as CatArgs);
        case 'Fish':
            return new Fish(args as FishArgs);
    }
}
Run Code Online (Sandbox Code Playgroud)

但我得到“过载签名必须全部是环境或非环境”。

TypeScript 支持这种类型的功能吗?我究竟做错了什么?

luk*_*ter 15

要指定您不需要的重载签名declare

export function getAnimal(type:'Cat', args:CatArgs): Cat;
export function getAnimal(type:'Fish', args:FishArgs): Fish;
export function getAnimal(type:Type, args:CarOrFishArgs): Animal {
    switch (type) {
        case 'Cat':
            return new Cat(args as CatArgs);
        case 'Fish':
            return new Fish(args as FishArgs);
    }
}
Run Code Online (Sandbox Code Playgroud)