машинопись множественная универсальная не может быть выведена правильно - PullRequest
0 голосов
/ 06 июня 2019

В 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 Ответ

2 голосов
/ 06 июня 2019

Компилятор не может действительно вывести что-либо значимое для U в вашем коде, так как он не будет знать, где разбить объединение. Вместо этого, так как были введены условные типы , я бы хотел сделать это по-другому ... просто позвольте 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[])[]
}

Это работает? Надеюсь, это поможет; удачи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...