typescript union类型判断不直观

问题描述 投票:0回答:2
type Has2<T extends readonly any[], U> = T[number] extends U ? true : never;

type UU = ['Kars', 'Esidisi'];

type AA = Has2<UU, 'Kars'>; 

我认为 AA 应该是类型 true,但类型从来都不是 我不知道为什么

我尝试询问chatGPT,但它的答案是AA类型是正确的

typescript types
2个回答
0
投票

当您使用 UU ["Kars", "Esidisi"]

索引访问
元组
 
Has2
 (=
T[number]
) 时,您将获得
联合类型 "Kars" | "Esidisi"

在您的示例中,您实际上检查是否

"Kars" | "Esidisi" extends "Kars"

。或者换句话说,您希望 
"Kars" | "Esidisi"
 可以分配给 
"Kars"
。然而,这种情况并非如此。处理联合时,仅当您要分配的类型的联合
成员少于目标类型时,分配才有效。

您可能想像这样反转条件:

type Has2<T extends readonly any[], U> = U extends T[number] ? true : never; type UU = ["Kars", "Esidisi"]; type AA = Has2<UU, "Kars">; // ^? type AA = true

TypeScript 游乐场


0
投票
type Test<T, U> = T extends U ? true : never type Result = Test<'A' | 'B', 'A'> // type Result = true type Test2<T extends any[], U> = T[number] extends U ? true : never type Result2 = Test<['A', 'B'], 'A'> // type Result2 = never
其实我想知道Test和Test2有什么区别

© www.soinside.com 2019 - 2024. All rights reserved.