试图理解类型之间的关系我有这段代码
type CheckIfExtends<A, B> = A extends B ? true : false;
type T1 = CheckIfExtends<number, unknown>; //true
type T2 = CheckIfExtends<number, {}>; //true
type T3 = CheckIfExtends<number, any>; //true
type T4 = CheckIfExtends<() => void, unknown>; //true
type T5 = CheckIfExtends<() => void, {}>; //true
type T6 = CheckIfExtends<() => void, any>; //true
type T7 = CheckIfExtends<unknown, any>; //true
type T8 = CheckIfExtends<any, unknown>; //true
type T9 = CheckIfExtends<{}, unknown>; //true
type T10 = CheckIfExtends<{}, any>; //true
type T11 = CheckIfExtends<any, {}>; //boolean
type T12 = CheckIfExtends<unknown, {}>; //false
链接到游乐场
有人可以解释一下吗?有什么区别?怎么可能any extends {}
and any
不延长{}
同时?如果any extends unknown
and unknown extends any
那么这是否意味着它们是强平等的?这是 Typescript 之上的一个新缺陷吗?null
and undefinded
JavaScript的股权问题?
实际上,
type T = CheckIfExtends<any, number>; //boolean
本质上的区别是这样的:
-
the any type是故意不健全的,因为它可以分配向和从任何其他类型(可能的例外never
,取决于您使用它的位置)。不健全意味着类型的一些基本规则被破坏,例如及物性 of 子类型化。一般来说,如果A
可分配给B
, and B
可分配给C
, then A
可分配给C
. But any
打破了这一点。例如:string
可分配给any
, and any
可分配给number
... but string
is not可分配给number
。这种特殊的不健全性非常有用,因为它允许我们从本质上“关闭”难以或不可能正确键入的代码部分中的类型检查。但你需要非常仔细地思考any
作为一种类型;它更像是一种“非类型”。
-
空类型,{},是一种在运行时可以像对象一样对待的类型(也就是说,您可以从中读取属性或方法而不会出现运行时错误),但它没有known编译时的属性。这并不意味着它没有属性;而是意味着它没有属性。这只是意味着编译器不知道其中任何一个。这意味着仅null
and undefined
不可分配给{}
(null.foo
or undefined.foo
是运行时错误)。甚至像这样的原始类型string
可以被视为在运行时具有属性和方法("".length
and "".toUpperCase()
工作,甚至"".foo
刚刚返回undefined
)。当然,任何实际的对象类型也将被分配给{}
.
另一方面,{}
类型不可分配to种类非常多。如果我有类型值{}
尝试将其分配给类型的变量{foo: string}
,将会出现编译错误,如{}
不知道含有foo
财产。您可以分配{}
其本身,或者更广泛的类型,例如unknown
,或“un-type”any
.
这使得{}
very nearly 顶级类型,这是所有其他类型都可分配给的类型。它本质上是一个顶级类型null
and undefined
从中删除。
-
the unknown type是在 TypeScript 3.0 中引入的true顶部类型; TypeScript 中的每个类型都可以分配给unknown
. Even null
and undefined
可分配给unknown
.
再说一遍,另一方面,unknown
只能分配给它自己和“un-type”any
。即便是{}
类型不够宽,无法分配unknown
到它。反而,unknown
本质上相当于{} | null | undefined
(并且被视为如此,因为打字稿 4.8)
你的大部分CheckIfExtends<A, B>
结果可以用上面的解释。例外的是T11
:
type T11 = CheckIfExtends<any, {}>; //boolean
Your CheckIfExtends<A, B>
类型定义是一个分配条件类型,当A
是联合类型,因为如果联合的各个部分都满足两个分支,则它允许采用条件的两个分支。当A
is any
,除非当B
is any
or unknown
(so T8
行为正常)。有一些关于这个的讨论微软/TypeScript#27418。反正,T11
取两个分支,你会得到true | false
这是boolean
。 (来自 microsoft/TypeScript#27418,unknown
in the A
位置不分布,所以T7
and T12
行为也正常)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)