TypeScript:条件类型,并使用布尔参数控制返回类型

时间:2018-07-19 21:40:25

标签: typescript typescript-generics conditional-types

如何使用条件类型重写无重载签名的代码?

function foo(returnString: true): string;
function foo(returnString: false): number;
function foo(returnString: boolean) {
  return returnString ? String(Math.random()) : Math.random();
}

我尝试了以下代码,但是没有as any,它不会编译:

function foo<T extends boolean>(returnString: T): T extends true ? string : number {
  return (returnString ? String(Math.random()) : Math.random()) as any;
}

如何摆脱as any

该错误消息无济于事:

Type 'string | number' is not assignable to type 'T extends true ? string : number'.
  Type 'string' is not assignable to type 'T extends true ? string : number'.

2 个答案:

答案 0 :(得分:3)

我不确定为什么编译器不能按原样接受(对TypeScript不太熟悉),但是您可以执行以下操作:

function foo<T extends boolean>(returnString: T): T extends true ? string : number;
function foo<T extends boolean>(returnString: T): string | number {
  return returnString ? String(Math.random()) : Math.random();
}

基本上,您将声明(公共签名)和实现分开,为声明提供更准确的签名,为实现提供更广泛的签名。

答案 1 :(得分:0)

我认为您应该这样编写函数:

export class MyService {

    request(param: false): string; // must a defination;

    request(param: true): number;

    request(param: any): string | number {
        return null;
    }

}

https://github.com/angular/angular/blob/master/packages/common/http/src/client.ts借来的

使用打字稿2.8,您可以这样编写func:

function fun<T extends true | false>(t: T): T extends true ? string : number {
    return null;
}