You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

TypeScript中interface与type映射类型差异及readonly实现疑问

如何用Interface实现批量设置Readonly属性,以及Interface和Type的差异

一、用Interface实现需求的方法

你无法直接在Interface内部使用映射语法([p in keyof A]),但可以通过继承TypeScript内置的Readonly工具类型来实现:

interface A {
  name: string;
  age: number;
  like: string[];
}

// 通过继承Readonly<A>,让B拥有A的所有readonly属性
interface B extends Readonly<A> {}

Readonly<A>是TypeScript内置的工具类型,它会自动将A的所有属性转换为readonly版本,Interface可以直接继承这个转换后的类型,从而达到批量设置readonly的效果。

二、Interface和Type在该场景下的核心差异

  • 映射类型支持差异:映射语法([p in keyof T])是Type别名独有的特性,Interface不支持这种动态遍历并生成属性的语法,它只能声明固定属性、继承现有类型,或使用静态索引签名。
  • 类型操作灵活性差异:Type别名支持更多复杂的类型变换,比如映射、条件类型、交叉/联合类型组合等,适合做类型的转换和复用;Interface则更专注于对象结构的定义,在动态类型生成上能力有限。
  • 声明合并特性差异:Interface支持声明合并——多次声明同一个Interface,TypeScript会自动合并它们的属性;而Type别名不支持合并,重复声明会直接报错。
  • 使用场景差异:Interface更适合定义对外暴露的API接口、类的实现契约;Type别名则更适合处理内部的类型转换、组合场景,比如生成readonly/可选属性版本、定义联合类型、元组等。

内容的提问来源于stack exchange,提问作者bughou

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 21:30:04