typescript - 打字稿可以缩小泛型类型中的联合类型吗?
问题描述
可以用这种意图编译代码:
type Tick = Date | number;
type Unary<T, R> = (_: T) => R;
function formatter<T extends Tick>(tick: T): Unary<T, string> {
if (tick instanceof Date) {
return (date: Date) => date.toUTCString();
}
return (int: number) => int.toFixed();
}
我的想法是 if T
is Date
,tick
isDate
和 return type is Unary<Date, string>
,但 Typescript 尝试将其与Unary<T, string>
. 是因为T extends Tick
比Tick
工会更广泛吗?如果是这样,我可以限制这个泛型吗?
解决方案
不要认为您可以缩小泛型参数的类型。由于编译器假定类型参数可以是任何派生类型,因此任何类型 gard 仍将保留其中的类型参数,因此它无法消除它不确定的内容。
此外,您要做的是根据对参数的检查来缩小所有类型参数的出现(即返回类型中的出现),这绝对是不可能的。类型保护对特定变量起作用,而不是对整个类型起作用。
一种选择是使用单独的实现签名:
type Tick = Date | number;
type Unary<T, R> = (_: T) => R;
function formatter<T extends Tick>(tick: T): Unary<T, string>
function formatter(tick: Tick): Unary<Date, string> | Unary<number, string> {
if (tick instanceof Date) {
return (date: Date) => date.toUTCString();
}
return (int: number) => int.toFixed();
}
推荐阅读
- php - 在可变维度数组中将子项的值加到其父项
- vue.js - TinyMCE 自定义按钮 VUE
- php - 每次有人访问您的网站时如何运行 PHP 脚本?
- r - R M1 构建不会编译包
- node.js - MongoDB $文本搜索按多个字段nodejs的最大匹配排序
- c++ - c++调用python pytorch模型,结果不一样?
- php - 无法使用 php-cron-scheduler 执行文件
- java - 无法在 OnMapReady (Android Studio) 中获取 getter 的值
- javascript - 如何覆盖 WebSocket onmessage 事件
- php - 如何在 PHP 函数中绑定两个或多个数组的值?