#reactjs #typescript #react-redux
Вопрос:
Вот что я пытаюсь сделать. Я хотел написать addIdToAnimal
функцию, которая берет любое животное и добавляет к нему идентификатор.
У каждого животного есть animalType
атрибут, который является символом enum
.
Мои вопросы таковы:
- Наличие
animalType
должно помочь определить, какойAnimalType
объект находится в более позднем процессе (например, взаимодействоватьAnimal[]
и запускать различную логику в зависимости отAnimalType
). Но я не уверен, что лучше всего определять тип с фиксированным значением. Другие предложения очень приветствуются. - В настоящее
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. Я довольно часто сталкивался с такой ситуацией. Я посмотрю, имеет ли это смысл в нашем контексте. Большое спасибо!