如何从TypeScript的ReadWrite接口派生出只读的ReadonlyInt接口?
当然可以实现!不用手动复制字段的优雅方案
你完全不需要手动复制readwrite里的所有字段,TypeScript本身就提供了专门的工具来帮你快速生成只读版本的类型/接口,还能自动同步原接口的字段变化,非常适合字段多的场景。
方法1:使用内置的Readonly<T>工具类型
这是最直接的方式,TypeScript标准库自带的Readonly<T>工具类型,会自动将传入类型T的所有属性转换为只读(readonly)状态。你可以直接用它生成只读版本的类型:
interface Readwrite { f1: string; f2: boolean; } // 生成只读版本的类型 type ReadonlyInt = Readonly<Readwrite>; // 使用示例:此时ReadonlyInt的f1和f2都是只读的 const obj: ReadonlyInt = { f1: "test", f2: true }; obj.f1 = "new value"; // 这里会报错,因为f1是只读属性
方法2:定义继承式的只读接口
如果你确实需要一个接口而不是类型别名,也可以通过接口继承Readonly<T>的方式来实现:
interface Readwrite { f1: string; f2: boolean; } // 继承Readonly<Readwrite>来创建只读接口 interface ReadonlyInt extends Readonly<Readwrite> {} // 使用效果和上面完全一致 const obj: ReadonlyInt = { f1: "test", f2: true }; obj.f2 = false; // 同样会触发类型错误
为什么这两种方式好用?
不管是用类型别名还是接口继承,当你后续修改readwrite接口的字段(比如新增、删除或者修改字段类型),ReadonlyInt都会自动同步这些变化,完全不需要手动维护两个接口的字段一致性,完美解决了你担心的字段列表过长的问题。
内容的提问来源于stack exchange,提问作者Galdor
相关产品推荐
相关产品推荐

