最近学习了一些
ts
知识,偶然看到了 type-challenges (opens new window) 项目,感觉很有意思,是个很好的练习工具,来体验下
# ts-challenge 是什么?
项目意在于更好的了解 TS 的类型系统,如果对于英文不熟悉可以直接看README.zh-CN.md (opens new window)
# 前置知识
在这之前需要掌握一点Ts基础知识,可以参考学习记录TypeScript学习记录-[数据类型]、TypeScript学习记录-[类和接口]、TypeScript学习记录-[枚举和泛型]、TypeScript学习记录-[类型别名]
# 题目分析
主要是认识一下在线工具的使用,进入页面点击左上角 run
在右侧抛出两条错误,点击报红处给出同样的错误信息 Type 'false' does not satisfy the constraint 'true'.
将鼠标移至 Expect
可以看到其类型值为继承自 true
的泛型约束,错误信息表示其内部的 NotAny
、Equal
返回值均为 false
,所以需要确保两者返回为 true
将鼠标移至 NotAny
可以看到其类型值为布尔值,取决于 继承自对 IsAny<T>
类型的判断,若其返回值为 true
需要 IsAny<T>
为 false
,即泛型 <T>
不能是 any
类型
将鼠标移至 Equal(X, Y)
可以看到其类型值为布尔值,取决于泛型函数 <T>()
的返回值,若其返回值为 true
需要 (T extends X) extends (T extends Y)
即 X
与 Y
相等
# 解答
从前面的分析我们知道要确保第一条测试通过, HelloWorld
不能是 any
类型
要确保第二条测试通过,HelloWorld
类型需要与 string
类型相同
# other
isAny 的实现
type A = IsAny<string> // false
type B = IsAny<any> // true
type C = IsAny<unknown> // false
type D = IsAny<never> // false
// 实现IsAny
type IsAny<T> = true extends (T extends never ? true : false) ?
false extends (T extends never ? true : false) ? true : false
: false;
// 更简单的实现
type IsAny<T> = 0 extends (T & 1) ? true : false;