TypeScript中用交叉运算符&组合interface生成type是否合法?
为什么可以通过 interface 交叉生成 type
这个写法完全符合 TypeScript 的类型系统规则,核心原因有两点:
interface声明的本质就是一个对象类型,属于 TypeScript 类型系统的一等公民,和type声明的类型别名没有运算层面的限制,完全可以参与所有类型运算。- 你用到的
&是 TypeScript 内置的交叉类型运算符,作用是合并多个类型的所有成员,生成一个同时具备所有输入类型特性的新类型,它的入参支持任意合法的 TypeScript 类型,自然也包含interface声明的类型。
你示例代码里的 type Props = Props1 & Props2 等价于直接声明一个同时包含 age: number 和 name: string 属性的对象类型,和你用 interface Props extends Props1, Props2 {} 写出来的效果几乎一致,唯一差异是如果两个源类型存在同名不兼容属性时,extends 写法会直接抛出语法错误,交叉类型写法会将冲突属性的类型推导为 never。
这个特性属于交叉类型的通用能力,官方文档里没有单独针对 interface 做说明,是因为 interface 本身就是普通的类型实体,不需要单独做适配就可以直接参与所有类型运算。
内容的提问来源于stack exchange,提问作者devstefancho
相关产品推荐
相关产品推荐

