发现TypeScript中同名interface接口会自动合并的特性

TypeScript与jQuery插件开发
本文探讨了使用TypeScript为jQuery编写插件时遇到的一个有趣现象:可以在TypeScript中定义同名接口,并且这些接口的成员会被自动合并。文章还讨论了这种行为与C#等语言的区别以及可能的原因。

今天在学习怎么用TypeScript给jQuery写扩展插件时发现一个很有趣的事情

如上图,VS提示我应该在类C中实现b。

我可以同时定义一个重名的接口,而这个接口内容会自动合并。

这再C#中是绝对不允许的,除非在不同的命名空间中。

 

但如果我在重名接口中定义相同名称的属性会报重名错误。

也就说并不是js中的后定义的覆盖先前定义的内容。

 

虽然这些接口信息在编译都不复存在,在这个自动合并的特性还是有些让人费解。

应该是为了照顾js中的随意扩充对象的特性。

 

转载于:https://www.cnblogs.com/xxcanghai/p/4819428.html

TypeScript 中,`interface` 和 `type` 都可以用于定义对象类型,但它们在语义和使用场景上有一些关键区别。理解它们的异同可以帮助你写出更清晰、更安全的类型定义,特别是在 Vue 3 中定义 `props`、`emits`、`store` 等结构时尤为重要。 --- ### ✅ 一、基本用法对比 #### 1. `interface` ```ts interface User { id: number name: string } ``` #### 2. `type` ```ts type User = { id: number name: string } ``` 两者在定义对象结构时几乎完全相同,都可以被用来定义 Vue 组件的 `props` 类型、函数参数类型等。 --- ### ✅ 二、主要区别 | 特性 | `interface` | `type` | |------|-------------|--------| | **可扩展性(声明合并)** | ✅ 支持多次声明合并 | ❌ 不支持 | | **联合类型** | ❌ 不支持 | ✅ 支持 | | **元组、基本类型别名** | ❌ 不适合 | ✅ 支持 | | **映射类型、条件类型** | ❌ 有限支持 | ✅ 支持 | --- ### ✅ 三、详细对比说明 #### 1. 声明合并(Declaration Merging) `interface` 支持同名接口的多次声明,TypeScript自动合并它们: ```ts interface User { id: number } interface User { name: string } // 实际等价于: // interface User { // id: number // name: string // } ``` `type` 不支持这种行为,重复定义会报错: ```ts type User = { id: number } type User = { name: string } // ❌ Error: Duplicate identifier 'User' ``` #### 2. 联合类型(Union Types) `type` 可以使用联合类型来定义多个可能的类型: ```ts type ID = number | string type Result = 'success' | 'error' ``` `interface` 不支持联合类型。 #### 3. 类型别名 vs 接口(语义差异) - `type` 更适合用于**类型别名**、**联合类型**、**交叉类型**、**映射类型**等高级类型操作。 - `interface` 更适合用于描述**对象形状**,特别是需要被实现(`implements`)的类结构。 #### 4. 映射类型和条件类型 `type` 支持更复杂的类型操作,例如: ```ts type PartialUser = Partial<User> type ReadonlyUser = Readonly<User> type MyType = T extends U ? true : false ``` 这些在 `interface` 中无法实现。 --- ### ✅ 四、Vue 3 使用建议 在 Vue 3 中定义组件的 `props`、`emits`、`store` 等类型时,推荐使用 `interface` 来描述对象结构,因为它更清晰、可读性强,并且可以被类实现(如组件逻辑抽离到类中时)。 ```ts interface User { id: number name: string } defineComponent({ props: { user: { type: Object as PropType<User>, required: true } }, setup(props) { // ... } }) ``` 而当你需要定义联合类型、映射类型、泛型等高级类型时,使用 `type` 更合适: ```ts type Theme = 'light' | 'dark' type StoreState = { user: User | null } ``` --- ### ✅ 五、总结对比表 | 特性 | `interface` | `type` | |------|-------------|--------| | 定义对象结构 | ✅ | ✅ | | 支持声明合并 | ✅ | ❌ | | 支持联合类型 | ❌ | ✅ | | 支持基本类型别名 | ❌ | ✅ | | 支持映射类型/条件类型 | ❌ | ✅ | | 更适合定义组件类型 | ✅ | ⚠️ | | 更适合高级类型操作 | ❌ | ✅ | --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值