【问题标题】:Types of property 'X' are incompatible属性“X”的类型不兼容
【发布时间】:2021-06-03 20:40:08
【问题描述】:

这就是我想要做的。我想写一个addIdToAnimal 函数,它接受任何Animal,并为其添加id。

每个动物都有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,
  }
}

【问题讨论】:

    标签: reactjs typescript react-redux


    【解决方案1】:
    type Lion = {
      id: number;
      animalType: AnimalType;
      detail: LionDetail;
    };
    
    type Salmon = {
      id: number;
      animalType: AnimalType;
      detail: SalmonDetail;
    };
    

    输入AnimalType.MammalAnimalType.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);
    

    【讨论】:

    • 感谢您的意见。你说的完全正确。有什么办法可以确保Lion 总是有animalType: AnimalType.Mammal
    • 最好的面向对象方法是创建一个 Lion 类,并在构造函数中将animalType 设置为AnimalType.Mammal,只要你想创建一个新的 lion 实例,你就会得到animalType 属性预设。
    • 答案中更新了一个OO方法的例子。
    • 我经常遇到这种情况。我会看看它在我们的上下文中是否有意义。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 2021-12-06
    • 2019-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-19
    • 2019-02-20
    • 2018-11-21
    相关资源
    最近更新 更多