Как сделать так, чтобы компилятор TS знал, что неизвестная переменная имеет некоторые свойства (без использования типа `any`) - PullRequest
0 голосов
/ 08 июня 2019
function f(): unknown {
    return {abc: "ABC"};
}

const a = f();

if (a && a instanceof Object && a.hasOwnProperty("abc")) {
    console.log(a.abc);
}

У меня есть переменная a, которая вначале имеет тип unknown (> = TypeScript 3.0). Я хочу использовать свойство abc a внутри оператора if, если , когда a имеет свойство.

VS code ts error screenshot

Однако, как показано на приведенном выше скриншоте кода VS, компилятор TypeScript выдает ошибку TS2339, хотя я проверил a.hasOwnProperty("abc") в условии if.

Свойство 'abc' не существует для типа 'объект'. TS (2339) * * тысяча двадцать одна

Я знаю, что могу обойти эту ошибку, приведя тип a к any, но это заставит компилятор игнорировать опечатки имен членов, и будет плохо, если в * 1026 будет много свойств и многое, что можно сделать с переменной a.

Есть ли способ для компилятора TypeScript узнать, что a имеет определенные свойства?

Ответы [ 2 ]

1 голос
/ 08 июня 2019

Вы можете использовать { [index: string]: unknown } вместо unknown, чтобы сообщить TypeScript, что ваш объект является словарем неизвестных свойств.

declare const unfamiliar: { [index: string]: unknown };

if ('foo' in unfamiliar) {
  unfamiliar.foo;
}
0 голосов
/ 08 июня 2019

Ошибка исходит из утверждения, что a является Object.Тип Object не содержит abc, поэтому следующее утверждение не имеет значения.
Если оставить только утверждение a.hasOwnProperty(), оно должно работать.

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