TypeScript中如何基于对象自身其他属性为指定键赋值条件值
问题原因
你当前的写法不生效核心有两个原因:
- 对象字面量初始化过程中,无法直接引用自身还未创建完成的其他属性,你尝试的
animal.owner在对象赋值完成前animal还是未就绪状态,拿不到当前对象的实际值。 - 对象字面量中的
this不会指向当前正在创建的对象,默认指向全局作用域(严格模式下为undefined),所以this.owner永远取不到你预期的当前对象的owner属性。
可行解决方案
方案1:使用工厂函数创建对象(推荐,符合类型约束,初始化时自动计算)
// 定义排除isFood的入参类型 type AnimalCreateParams<T> = Omit<animalInterface<T>, 'isFood'> function createAnimal<T>(params: AnimalCreateParams<T>): animalInterface<T> { return { ...params, // 此时params已经包含owner属性,可直接判断 isFood: !params.owner } } // 使用方式 let animal = createAnimal<personInterface>({ owner: {...person}, sound: "Woof", species: "Dog" }) let animal2 = createAnimal<personInterface>({ sound: "Woof", species: "Dog" })
最终animal.isFood为false、animal2.isFood为true,完全符合预期。
方案2:使用getter实现动态计算(适合需要后续修改owner时自动同步isFood的场景)
// 接口定义无需修改 interface animalInterface<T> { owner?: T, sound: string, species: string, isFood: boolean } // 声明对象时用get语法 let animal: animalInterface<personInterface> = { owner: {...person}, sound: "Woof", species: "Dog", get isFood() { return !this.owner } } let animal2: animalInterface<personInterface> = { sound: "Woof", species: "Dog", get isFood() { return !this.owner } }
这种写法的额外优势是如果后续修改animal.owner = undefined,访问animal.isFood会自动更新为true,不需要手动赋值。
方案3:分步骤赋值(最小改动方案,不需要调整原有结构)
// 先赋值基础属性 let animal = { owner: {...person}, sound: "Woof", species: "Dog" } as animalInterface<personInterface> // 此时animal已初始化完成,可直接判断owner属性 animal.isFood = !animal.owner let animal2 = { sound: "Woof", species: "Dog" } as animalInterface<personInterface> animal2.isFood = !animal2.owner
内容的提问来源于stack exchange,提问作者Zaf
相关产品推荐
相关产品推荐

