gpt4 book ai didi

用于推断的 never[] 和 any[] 的 Typescript UnpackArrayType 工作不正确

转载 作者:行者123 更新时间:2023-12-05 04:41:19 25 4
gpt4 key购买 nike

我尝试使用 (infer R)[] 来解包neverany 类型的数组。

type UnpackArrayType<T> = [T] extends [(infer R)[]] ? R : false;

但结果出乎意料:Typescript 既没有从“else”(非数组条件)中转换为 false,也没有检测到推断类型 R。

demo link

type UnpackArrayType<T> = [T] extends [(infer R)[]] ? R : false; // false type used as non-array-marker
type UA<T> = UnpackArrayType<T>; // just alias

type TypeTesting = {
"never": UA<never>, // unknown - incorrect
"never[]": UA<never[]>, // never - correct

"any": UA<any>, // unknown - incorrect
"any[]": UA<any[]>, // any - correct

"unknown": UA<unknown>, // false - correct
"unknown[]": UA<unknown[]>, // unknown - correct

"null": UA<null>, // false - correct
"null[]": UA<null[]>, // null - correct

"undefined": UA<undefined>, // false - correct
"undefined[]": UA<undefined[]>, // undefined - correct

"number": UA<number>, // false - correct
"number[]": UA<number[]>, // number - correct
}

为什么 anynever 类型解包为 unknown

最佳答案

extends 测试类型之间的关系,然后尝试提取推断的位置。

anynever 都具有它们是任何其他类型的子类型的属性(any 更奇怪,因为它也是一个基类任何其他类型的类型)。因此,询问 never extends Tany extends T 的问题将对任何类型 T 返回 true。

在扩展问题得到回答后,我们可以考虑推理问题,因为没有好的方法从 [(infer R)[]] 中提取 R anynever 你最终会得到 unknown

您可以对这两种通用类型进行特例处理:

type UnpackArrayType<T> = 
[T] extends [never] ? false: // nothing extends never except never itslef
[T & 1] extends [T & 2]? false : // T & 1 extends T & 2 will only be true if T is any and the & 1 and & 2 get absorbed into any
[T] extends [(infer R)[]] ? R : false; // false type used as non-array-marker
type UA<T> = UnpackArrayType<T>; // just alias

type TypeTesting = {
"never": UA<never>, // false - correct
"never[]": UA<never[]>, // never - correct

"any": UA<any>, // false - correct
"any[]": UA<any[]>, // any - correct

"unknown": UA<unknown>, // false - correct
"unknown[]": UA<unknown[]>, // unknown - correct

"null": UA<null>, // false - correct
"null[]": UA<null[]>, // null - correct

"undefined": UA<undefined>, // false - correct
"undefined[]": UA<undefined[]>, // undefined - correct

"number": UA<number>, // false - correct
"number[]": UA<number[]>, // number - correct
}

Playground Link

注意:要从已知为数组的类型中提取元素类型,您还可以使用 T[number]

关于用于推断的 never[] 和 any[] 的 Typescript UnpackArrayType 工作不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70106786/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com