typescript - 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'.
解决方案
我不确定为什么编译器不能按原样接受这个(对 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();
}
基本上,您将声明(公共签名)和实现分开,为声明提供更准确的签名,为实现提供更广泛的签名。
推荐阅读
- excel - 如果工作表存在,请不要添加另一个工作表
- rest - Kafka消息通过rest api
- android - Android Vector Drawables在调整大小时变得模糊
- openscenegraph - 切换线框模式
- google-chrome - 在 Chrome 中打印网页的自定义 Css 版本
- api - 是否有支持纬度/经度的免费历史天气数据 API?
- scala - 单个管道中的多个 Spark DataFrame 突变
- ruby-on-rails - 提交表单时如何获取 f.select/options_for_select 数据
- jsf - 是否可以将 JSF Web 应用程序转换为产品?
- c# - .net Core 访问 appsettings.json 时配置不同的配置提供程序