TypeScript:条件类型和使用 bool 参数来控制返回类型

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

最佳答案

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

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

关于TypeScript:条件类型和使用 bool 参数来控制返回类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51432121/

相关文章:

javascript - Karma-typescript 接口(interface) XXX 无法同时扩展类型 ' YYY

typescript - TypeScript 泛型的唯一约束

javascript - TypeScript 泛型创建实例

javascript - 这两个 "extends"子句有什么区别?

使用元组/联合支持进行深度转换的 TypeScript 映射类型

TypeScript:测试条件类型相等性 - 理解语法

visual-studio-2012 - TypeScript 0.9.1、ReSharper 8.x 和 VS2012 是否存在任何已知问题?

javascript - ionic 2 - 将句子字符串转换为单词数组

javascript - 测试不运行,因为 typescript 在尝试测试类型检查时抛出错误

typescript - 从类的属性和方法中提取特定类型并将其添加到接口(interface)