Типы свойств «X» несовместимы

#reactjs #typescript #react-redux

Вопрос:

Вот что я пытаюсь сделать. Я хотел написать addIdToAnimal функцию, которая берет любое животное и добавляет к нему идентификатор.

У каждого животного есть animalType атрибут, который является символом enum .

Мои вопросы таковы:

  1. Наличие animalType должно помочь определить, какой AnimalType объект находится в более позднем процессе (например, взаимодействовать Animal[] и запускать различную логику в зависимости от AnimalType ). Но я не уверен, что лучше всего определять тип с фиксированным значением. Другие предложения очень приветствуются.
  2. В настоящее addIdToAnimal время выдает ошибку машинописного текста: Types of property 'animalType' are incompatible. Как я могу это исправить?
 enum AnimalType {
  Mammal,
  Fish,
}

type Animal =  Lion | Salmon;

type Lion = {
  id: number;
  animalType: AnimalType.Mammal;
  detail: LionDetail;
};

type Salmon = {
  id: number;
  animalType: AnimalType.Fish;
  detail: SalmonDetail;
};

interface LionDetail {
  roar: () => void
}

interface SalmonDetail {
  swim: () => void
}

const addIdToAnimal = (animal: Omit<Animal, 'id'>): Animal => {
  return {
    id: 1,
    ...animal,
  }
}
 

Ответ №1:

 type Lion = {
  id: number;
  animalType: AnimalType;
  detail: LionDetail;
};

type Salmon = {
  id: number;
  animalType: AnimalType;
  detail: SalmonDetail;
};
 

Ввод AnimalType.Mammal или AnimalType.Fish — это значения, а не типы.

Объектно-ориентированный подход к тому, чего вы хотите достичь

 interface ILion {
    id: number;
    readonly animalType: AnimalType;
    detail: LionDetail;
}

class Lion implements ILion { 
    constructor(id: number) { 
        this.animalType = AnimalType.Mammal;
        this.id = id;
    }
}

let newLion = new Lion(1);
 

Комментарии:

1. Спасибо вам за ваш вклад. То, что вы сказали, абсолютно правильно. Есть ли какой-нибудь способ гарантировать Lion , что так будет всегда animalType: AnimalType.Mammal ?

2. лучший объектно-ориентированный подход для этого заключается в том, что вы можете создать класс Lion, и в конструкторе вы можете установить animalType , как AnimalType.Mammal всякий раз, когда вы хотите создать новый экземпляр lion, вы получите предустановленное свойство AnimalType.

3. Пример подхода OO обновлен в ответе.

4. Я довольно часто сталкивался с такой ситуацией. Я посмотрю, имеет ли это смысл в нашем контексте. Большое спасибо!