typescript - TypeScript 中的条件类型问题
问题描述
这是一个复杂代码的简化示例:
type ValueType<T> = [T] extends [string] ? Value<string> : Value<T>;
interface Value<T> {
set(v: T): void
}
export type Bar<T> = T extends true ? boolean : number
function foo<T>(vt: ValueType<Bar<T>>, v: Bar<T>) {
vt.set(v); <-- error here
}
最新的 TypeScript (v4.1.3) 在以下语句vt.set(v)
中失败:
“Bar”类型的参数不能分配给“string & Bar”类型的参数。
这种行为是记录在某处还是一个错误?
解决方案
什么是错误
这是您收到的错误:
Argument of type 'Bar<T>' is not assignable to parameter of type 'string & Bar<T>'.
Type 'number | boolean' is not assignable to type 'string & Bar<T>'. Type 'number' is not assignable to type 'string & Bar<T>'.
Type 'number' is not assignable to type 'string'.
Type 'Bar<T>' is not assignable to type 'string'. Type 'number | boolean' is not assignable to type 'string'.
所以根本原因是Type 'Bar<T>' is not assignable to type 'string'. Type 'number | boolean' is not assignable to type 'string'.
,出现这个错误是非常有意义的,我们在下面解释
解释
事实1:
基于export type Bar<T> = T extends true ? boolean : number
- 酒吧只能是
boolean
或number
事实2:
基于type ValueType<T> = [T] extends [string] ? Value<string> : Value<T>;
- 意味着
ValueType
可以Value<string>
事实 3:
基于foo<T>(vt: ValueType<Bar<T>>, v: Bar<T>)
- 使用事实 2,意味着
means vt.set can take string
解析度
基于 Fact 1(只能是boolean
or number
)和 Fact 2(可以采用 a string
),我们收到来自 TypeScript 的错误消息:Type 'number | boolean' is not assignable to type 'string'
推荐阅读
- c# - 是否使用 System.Security.Cryptography.RSACng 来签名和验证数据线程安全?
- python - 将表列和值转换为嵌套 JSON
- angular - Angular - 可安装性“未检测到匹配的服务人员”
- angular - 动态地图点数据,doc.getElementById('id1') 以角度返回 null
- numbers - Scheme中数字->字符串不准确
- deep-learning - Deep CNN 的低准确率
- javascript - 为什么我的闭包函数不想在 if 语句中重新分配其父函数变量?
- java - 如何使用 GeoTools 恢复内存中形状的特征?
- python-3.x - 用 lambda 减少函数
- node.js - 使用 pkgcloud 在 OpenStack 中创建卷