TypeScript:数组是否有类型映射?

3

假设我有一个布尔值列表:

const a: boolean[] = [true, false, false];

我能否创建一个只有在至少有一个布尔值为真时才触发的条件类型?


当所有布尔值都为真时,可以这样做:

type BList = true[] | false[];

type AreAllTrue<T extends BList> = T[number] extends true ? true : false;

const a: BList = [true, true, true];

const b: AreAllTrue<typeof a> = true; // This compiles
const c: AreAllTrue<typeof a> = false; // This doesn't (as expected)

// type AnyAreTrue<???> = ???

但是我需要列表中既有 true 又有 false,而不仅仅是一个类型的布尔值。


4
你的意思是你有一个元组类型,类似于const a: [true, true, false] = [true, true false]吗?因为如果这个“类型”实际上是一个boolean[]数组的话,TypeScript并不知道它内部的情况。 - decorator-factory
4
或者const a = [true, true, false] as const,但如果你有一个boolean[]数组,那么绝对没有任何编译时的操作。 - tokland
1个回答

4

也许这就是你想要的?

type AnyIsTrue<T extends boolean[]> = T extends false[] ? false : true

type _test0 = AnyIsTrue<[]>  // false
type _test1 = AnyIsTrue<[false]>  // false
type _test2 = AnyIsTrue<[false, true]>  // true
type _test3 = AnyIsTrue<[false, true, false]>  // true

希望这样说有意义:仅当布尔数组是 false[] 子类型时,它才没有任何 true
但是,正如我在评论中所说的,如果变量的类型是 boolean[],TypeScript 无法对其进行太多分析。它不知道数组中有什么值。
type _test4 = AnyIsTrue<boolean[]>  // true

2
你在注释中的_test3处有打字错误,结果应该是true,与预期一致。 - ASDFGerte
或者 type AnyIsTrue<T extends boolean[]> = T extends false[] ? never : T - md2perpe
1
你可能需要强调一下,这对于类型为 boolean[] 的变量是不起作用的。 - Gaël J

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接