如何为TypeScript中两个相似类型编写兼容的处理函数?
解决TypeScript联合类型返回值不匹配问题
你的问题出在addSuffix函数返回的是First | Second联合类型,TypeScript无法确定返回的具体是哪一个类型,所以当doA尝试将其作为First返回时,编译器会报错——因为联合类型里可能包含缺少address属性的Second。
在TypeScript里,你可以用泛型函数结合类型约束来解决这个问题,既贴合OOP中接口实现的思路,又能保证类型安全:
方案1:直接用泛型约束公共属性
修改addSuffix为泛型函数,约束泛型参数必须包含name属性:
type First = { name: string, address: string, } type Second = { name: string, email: string, } // 泛型函数,T约束为包含name属性的类型 function addSuffix<T extends { name: string }>(payload: T): T { payload.name += "suffix"; return payload; } const a: First = { "name": "John", "address": "London", } const b: Second = { "name": "Alice", "email": "alice@alice.com" } function doA(payload: First): First { // some operations return addSuffix(payload); // 现在返回的是First类型,无报错 } function doB(payload: Second): Second { // some operations return addSuffix(payload); // 返回的是Second类型,无报错 } doA(a); doB(b);
方案2:定义公共接口(更贴近OOP接口实现思路)
先定义一个包含name属性的公共接口,让First和Second都兼容这个接口,再用泛型约束到该接口:
// 定义公共接口,对应OOP中的基接口 interface HasName { name: string; } type First = HasName & { address: string, } type Second = HasName & { email: string, } // 泛型约束到HasName接口 function addSuffix<T extends HasName>(payload: T): T { payload.name += "suffix"; return payload; } // 后续代码和之前一致,doA、doB返回值类型匹配,无报错
这两种方案都能让addSuffix保留传入参数的具体类型,而不是返回模糊的联合类型,完美解决类型不匹配的报错。
内容的提问来源于stack exchange,提问作者saydiva
相关产品推荐
相关产品推荐

