typescript 我可以缩小数组的并集吗?

vltsax25  于 2023-03-09  发布在  TypeScript
关注(0)|答案(2)|浏览(130)

我有一个工会,看起来像这样:

type MyUnion = string[] | number[];

所以它总是一个数组,字符串或数字。
我想知道我正在处理的数组是字符串数组还是数字数组,但是类型收缩似乎不起作用:

const arr: string[] | number[] = [];
if (typeof arr[0] === "string") {
   // arr has the type (string[] | number[])
}

那么,如何将narrow arr输入到联合体的类型之一呢?
Playground:https://www.typescriptlang.org/play?#code/FAMwrgdgxgLglgewgAhgUwM4wGKQBQCGATkQFzJZFwQDmA2gLrIA+yEYAtgEZpGMCU5AG4I4AE2ABvYMlnI4IZHhgBPAA5oEi4nwAMTALxHkAIkrUaJ-smly7yHTLkBfYK6A

bf1o4zei

bf1o4zei1#

可以使用类型保护。

function isStringArray(arr: string[] | number[]): arr is string[] {
  return typeof arr[0] === "string";
}

const arr: string[] | number[] = [];
if (isStringArray(arr)) {
  // arr is type string[]
} else {
  // arr is type number[]
}
kiayqfof

kiayqfof2#

您可以使用typeguard来实现这一点:

export function isStringArray(array: string[] | number[]): array is string[] {
  return typeof array[0] === "string";
}

或者你也可以用通用的方法来检查数组是否是字符串数组

export function isStringArray<T>(array: T[]): array is string[] {
  return array.every(element => typeof element === "string");
}

根据你的代码

if (isStringArray(arr)) {
  // arr has type string[]
}

相关问题