题目来源(type-challenges)
问题
type case1 = IsAny<any>
type case2 = IsAny<undefined>
type case3 = IsAny<unknown>
type case4 = IsAny<never>
type case5 = IsAny<string>
解答
type IsAny<X, Y = any> =
(<T>() => T extends X ? 1 : 2) extends
(<T>() => T extends Y ? 1 : 2) ? true : false
拆分
- 当用一些类型代替
X
和 Y
时,第二个 extends
关键字所做的基本上是问一个问题。 <T>() => (T extends X ? 1 : 2)
类型的变量是否可以赋值给 (<T>() => (T extends Y ? 1 : 2))
类型变量?
declare let x: <T>() => (T extends number ? 1 : 2)
declare let y: <T>() => (T extends number ? 1 : 2)
y = x
declare let x: <T>() => (T extends any ? 1 : 2)
declare let y: <T>() => (T extends number ? 1 : 2)
y = x
- 条件类型的可赋值规则
<…>
要求扩展后的类型与检查器定义的类型 相同/一模一样。 - 在解答里第三个
extends
和第一个 extends
里只有当 X
和 Y
相同时,才会赋值成功。比如两个都为 number
类型。
declare let x: <T>() => (T extends number ? 1 : 2)
declare let y: <T>() => (T extends number ? 1 : 2)
y = x
- 如果用
string
替换其中一个 number
,则会报错。
declare let x: <T>() => (T extends number ? 1 : 2)
declare let y: <T>() => (T extends string ? 1 : 2)
y = x
declare let x: <T>() => (T extends number ? 1 : 2)
declare let y: <T>() => (T extends string ? 1 : 2)
const a = x<string>()
const b = x<number>()
const c = y<string>()
const d = y<number>()
y = x
const e = y<string>()
const f = y<number>()