打字稿多个泛型无法正确推断

时间:2019-06-06 14:11:45

标签: typescript generics union

在带打字稿的vscode中

使用用户定义的类型防护措施时无法正确推断出多个泛型

const arraySample = [1, [3, 4], ["s"]];

const isFlat = <T, U>(array: (T | T[] | U | U[])[]): array is (T | U)[] => {
  return !array.some(Array.isArray);
};

if (isFlat(arraySample)) {
  arraySample;
}

vscode工具提示出现以下错误:

const isFlat: <number, number>(array: (number | number[])[]) => array is number[]

但我认为一定是

const isFlat: <number, string>(array: (number | number[] | string | string[])[]) => array is (number|string)[]

您能告诉我适当的解决方法吗?

1 个答案:

答案 0 :(得分:2)

编译器无法真正推断出代码中对U有意义的任何内容,因为它不知道在哪里拆分联合。相反,由于引入了conditional types,所以我倾向于采用另一种方式...只要让T为数组的元素类型,然后在类型保护中从中拉出数组类型即可。像这样:

const isFlat = <T>(array: T[]): array is Exclude<T, any[]>[] => {
    return !array.some(Array.isArray);
};

const arr = ["a", 2, true, Math.random() < 0.5 ? "d" : ["d"]];
if (isFlat(arr)) {
    arr; // (string | number | boolean)[]
} else {
    arr; // (string | number | boolean | string[])[]
}

行得通吗?希望能有所帮助;祝你好运!