TypeScript中如何合并type属性不同的两个接口为新类型
解决TypeScript中合并User和Admin创建PowerUser类型的问题
你当前的写法无法生效的原因是:User | Admin 的 type 字段类型是 'user' | 'admin',当它和 { type: 'powerUser' } 交叉时,type 字段会变成 'user' & 'admin' & 'powerUser',这是一个never类型,导致整个 PowerUser 类型无效。
要实现包含User和Admin除type外的所有字段、且type固定为'powerUser'的类型,你可以借助TypeScript内置的Omit工具类型来实现,无需重复定义字段:
方案一:分别移除两个接口的type后交叉
interface User { type: "user"; name: string; age: number; occupation: string; } interface Admin { type: "admin"; name: string; age: number; role: string; } // 移除User和Admin的type字段后交叉,再添加新的type type PowerUser = Omit<User, 'type'> & Omit<Admin, 'type'> & { type: 'powerUser' }; // 验证示例 const example: PowerUser = { type: "powerUser", age: 20, name: "max", occupation: "FE", role: "ma" }; // 类型检查通过
方案二:先交叉两个接口再移除type
因为User & Admin本身就会合并两个接口的所有字段(除了冲突的type),所以也可以先交叉再移除type,写法更简洁:
type PowerUser = Omit<User & Admin, 'type'> & { type: 'powerUser' };
两种方案最终得到的PowerUser类型完全一致,都会包含name、age、occupation、role以及固定值为'powerUser'的type字段。
内容的提问来源于stack exchange,提问作者Kai021195
相关产品推荐
相关产品推荐

