miliko0022
@miliko0022
Краткие личные сведения, включая интересующую вас

Property 'butlers' does not exist on type 'House'?

interface House {
    bedrooms: number,
    bathrooms: number
   }
   interface Mansion {
    bedrooms: number,
    bathrooms : number,
    butlers: number
   }
   function getProperty() : ( Mansion | House) {

    return {
    bedrooms: 10,
    bathrooms: 10,
    butlers: 10
    }
    // ...
   }

   const property = getProperty();

   const bedroomCount = property.butlers; //error
  • Вопрос задан
  • 40 просмотров
Решения вопроса 1
@Interface
А что вас смущает? У вас функция возвращает union тип. Значит там либо одно, либо другое. То есть набор полей у результата - это пересечение множества полей Mansion и House. В пересечении нет поля butlers.

Если будете вручную приводить к типу as Mansion как говорит 0xD34F можете нарваться на runtime ошибку. TS вам все верно говорит.

Вам нужно определиться, что делает ваша функция:
- возвращаяет одно из двух - тогда она может вернуть House, а там действительно нет butlers
- возвращает House и дополняет его butlers равным 10? Тогда возможно вам вообще нужен новый тип.

Если вы хотите вернуть что-то, что одновременно и Mansion и House используйте &:
function getProperty() : ( Mansion & House) {
...


Такой код читается как "вернуть объект который одновременно и Mansion и House". При этом в типе будет объединение множеств полей Mansion и House

P. S. если Mansion подвид House - можно использовать extends:
interface House {
    bedrooms: number,
    bathrooms: number
}
interface Mansion extends House {
    butlers: number
}
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
0xD34F
@0xD34F
const property = getProperty() as Mansion;
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы