Существует давняя ошибка / проблема, из-за которой TypeScript не выполняет анализ потока управления для сужения типа свойства, если ключ свойства является переменной: microsoft / TypeScript # 10530 ; это не было решено, потому что исправление наложило большое снижение производительности. В вашем случае это означает, что проверка типа защиты на _e[k]
не повлияет на последующее использование _e[k]
.
. Мой рекомендуемый обходной путь для этого - присвоить свойству доступ к индексу новую переменную и проверить это:
const ek = _e[k]; // new variable
obj[k] = typeof ek === "undefined" ? "" : ek.toString(); // no error now
Новая переменная ek
применяет обычный анализ типа потока управления, и ваша защита типа работает.
Другие возможности для различных случаев использования:
, если вы уже проверяли undefined
и null
, но компилятор не может это выяснить, самое простое изменение - использовать оператор ненулевого подтверждения !
:
obj[k] = typeof _e[k] === "undefined" ? "" : _e[k]!.toString(); // non-null assertion
Вы можете преобразовать свой код исключения типа в его собственное автономное выражение, чтобы вам никогда не приходилось повторно проверять исходное значение. Например:
obj[k] = (_e[k] || "").toString(); // refactor
Этот конкретный код работает только с единственными ложными значениями _e[k]
, которые могут иметь undefined
и ""
. Если _e[k]
может быть 0
, то это даст другой результат. В общем, вы можете создать новую функцию, которая будет делать все, что вы хотите:
function defined<T, U>(x: T | undefined, dflt: U): T | U {
return typeof x !== "undefined" ? x : dflt;
}
obj[k] = defined(_e[k], "").toString(); // refactor 2
Хорошо, надеюсь, одна из этих подсказок; удачи!
Детская площадка ссылка на код