Ошибка TypeScript для неопределенного значения, которое проверяется ранее - PullRequest
0 голосов
/ 25 апреля 2020

Я создал функцию, которая либо добавляет элемент в массив, либо обновляет элемент до заданного индекса, если он установлен.

Я использую TypeScript , и я обнаружил действительно странное поведение что я не могу понять.

Вот ссылка Playground .

Эта упрощенная функция подходит для TypeScript:

function OKAddOrUpdateFunction(item: string, index?: number) {
    const foo = index !== undefined
        ? Object.assign([], initialArray, { [index]: item }) : [...initialArray, item];
}

Теперь, если я использую const и сохраняю, либо определен index, либо нет, я могу использовать его позже:

function NOKAddOrUpdateFunction(item: string, index?: number) {
    const isIndexDefined = index !== undefined;

    const foo = isIndexDefined
        ? Object.assign([], initialArray, { [index]: item }) : [...initialArray, item];
}

TypeScript выдает ошибку, указывая на индекс внутри Object.assign:

(parameter) index: number | undefined
A computed property name must be of type 'string', 'number', 'symbol', or 'any'.(2464)

И я не могу понять, почему ...

1 Ответ

1 голос
/ 25 апреля 2020

Рассмотрим такой случай

function NOKAddOrUpdateFunction(item: string, index?: number) {
    const isIndexDefined = index !== undefined || true; // always true

    const foo = isIndexDefined
        ? Object.assign([], initialArray, { [index]: item }) : [...initialArray, item];
}

Теперь, даже если индекс равен undefined, isIndexDefined будет true, поэтому этот код будет выполняться Object.assign([], initialArray, { [index]: item }) и не будет выполнен, так как индекс массива не может быть неопределенным. (Это то, о чем вас предупреждает TS).

TS не может сделать предположение о ваших переменных до утверждения if.

В первом случае вы проверяете неопределенность напрямую, если, например, if (index !== undefined), и в этом случае для TS ясно, что в true случае ваш index является числом.

Возможные решения:

  • проверка на неопределенность внутри оператора if (предпочтительно)
  • запись [index as number], только если вы уверены (если кто-то изменит код раньше, если if, ТС не обнаружит ошибку)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...