Вы не можете использовать value.bar
, потому что это не определенно безопасно. Это может быть безопасно (потому что значение может быть строкой), но компилятор этого не знает точно, и он не позволит вам делать .bar
, если это не обязательно. То, что вы, вероятно, хотите сделать, это использовать type guard:
if (typeof value !== "string) {
value.bar
// This compiles happily, because inside this if, value has
// type 'fooInterface'. That's because TS now knows it isn't a string,
// so *must* be a fooInterface.
}
Вы можете играть с этим in the typescript playground: обратите внимание, что только один из value.bar
«s терпит неудачу, потому что он знает, что только что один неправильно.
Если вы не можете/не хотите этого делать, вы можете просто сказать компилятору, что знаете, что делаете, с утверждением типа (например, var definitelyFoo = (fooInterface) value
), но лучше всего выбрать защитника.
Да, тип объединения - это правильный способ сказать это. Но если это строка, у нее не будет свойства 'bar', поэтому для доступа к ней будет ошибка. Что вы на самом деле пытаетесь сделать? – artem
Если вы уверены, что это значение содержит значение fooInterface, вы можете убедить TypeScript вашей правды в значении '() .bar' или' (значение как fooInterface) .bar'. –
Misaz