【问题标题】:typescript multiple generic cannot infered properly打字稿多个泛型无法正确推断
【发布时间】:2019-06-06 14:11:45
【问题描述】:

在带有打字稿的 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: &lt;number, number&gt;(array: (number | number[])[]) =&gt; array is number[]

但我认为它必须是

const isFlat: &lt;number, string&gt;(array: (number | number[] | string | string[])[]) =&gt; array is (number|string)[]

您能告诉我正确的解决方案吗?

【问题讨论】:

    标签: typescript generics union


    【解决方案1】:

    编译器无法在您的代码中真正推断出任何对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[])[]
    }
    

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

    【讨论】:

      猜你喜欢
      • 2021-05-06
      • 1970-01-01
      • 2021-03-10
      • 1970-01-01
      • 2021-09-29
      • 2022-11-23
      • 1970-01-01
      • 2020-12-17
      • 1970-01-01
      相关资源
      最近更新 更多