最近学习了一些 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 的泛型约束,错误信息表示其内部的 NotAnyEqual 返回值均为 false,所以需要确保两者返回为 true

将鼠标移至 NotAny 可以看到其类型值为布尔值,取决于 继承自对 IsAny<T> 类型的判断,若其返回值为 true 需要 IsAny<T>false,即泛型 <T> 不能是 any 类型

将鼠标移至 Equal(X, Y) 可以看到其类型值为布尔值,取决于泛型函数 <T>() 的返回值,若其返回值为 true 需要 (T extends X) extends (T extends Y)XY 相等

# 解答

从前面的分析我们知道要确保第一条测试通过, 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;