首页 > 解决方案 > TypeScript:条件类型并使用布尔参数来控制返回类型

问题描述

如何在没有重载签名的情况下改写它,而是使用条件类型?

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'.

标签: typescripttypescript-genericsconditional-types

解决方案


我不确定为什么编译器不能按原样接受这个(对 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();
}

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


推荐阅读