TypeScript map加新属性报不存在,不改动Cat类型怎么加OriginAddedCat实现?
解决方案
我们可以通过TypeScript的交叉类型扩展原有Cat类型,不需要修改原始Cat的定义即可实现需求:
- 首先定义扩展后的新类型:
type OriginAddedCat = Cat & { origin: "Italy" | "France" } - 改造
addOrigin函数,以下提供两种实现方案:
方案1:不可变实现(推荐,无副作用)
不修改原数组中的Cat对象,返回全新的扩展类型对象:
type Cat = { name: string; fur: "brown" | "white" }; // 新增扩展类型,不改动原有Cat定义 type OriginAddedCat = Cat & { origin: "Italy" | "France" } const addOrigin = (animals: Cat[], origin: "Italy" | "France"): OriginAddedCat[] => animals.map((animal): OriginAddedCat => ({ ...animal, origin }));
方案2:可变实现(直接修改原对象)
如果业务场景需要直接修改原数组内的对象,可通过类型断言完成类型拓宽:
type Cat = { name: string; fur: "brown" | "white" }; type OriginAddedCat = Cat & { origin: "Italy" | "France" } const addOrigin = (animals: Cat[], origin: "Italy" | "France"): OriginAddedCat[] => animals.map((animal) => { const extended = animal as OriginAddedCat; extended.origin = origin; return extended; });
两种方案都可以解决Property 'origin' does not exist on type 'Cat'.ts(2339)的报错,方案1不会修改输入参数,更符合TypeScript类型安全的最佳实践。
内容的提问来源于stack exchange,提问作者Sir hennihau
相关产品推荐
相关产品推荐

