在带打字稿的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)[]
您能告诉我适当的解决方法吗?
答案 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[])[]
}
行得通吗?希望能有所帮助;祝你好运!