TypeScript中创建对象时如何符合接口约束且保留原始类型
TypeScript 约束对象类型同时保留原始结构的实现方案
方案1:使用 TS 4.9+ 内置的 satisfies 操作符(推荐)
这是目前最简洁的原生解决方案,satisfies 设计初衷就是处理「既要校验类型符合约束,又不丢失对象原始类型推导」的场景:
interface CheckNumberMethods { [key: string]: (n: number) => boolean } // 用satisfies做校验,不修改原始类型推导 const myMethods = { greaterThanFive: (n: number) => n > 5, isEven: (n: number) => n % 2 === 0, } satisfies CheckNumberMethods
此时myMethods的类型就是你需要的精确结构:{ greaterThanFive: (n: number) => boolean; isEven: (n: number) => boolean },如果对象内的方法不符合CheckNumberMethods的约束,TS会直接抛出校验错误。
方案2:泛型工具函数(兼容 TS 4.9 以下版本)
如果你的项目还未升级到TS 4.9,可以用通用泛型函数实现相同效果:
interface CheckNumberMethods { [key: string]: (n: number) => boolean } // 通用约束工具函数,仅做类型校验不修改返回值类型 const defineCheckNumberMethods = <T extends CheckNumberMethods>(obj: T) => obj const myMethods = defineCheckNumberMethods({ greaterThanFive: (n: number) => n > 5, isEven: (n: number) => n % 2 === 0, })
该方案的效果和satisfies完全一致,泛型会自动推导传入对象的原始类型,同时保证传入参数符合接口约束。
内容的提问来源于stack exchange,提问作者thetarnav
相关产品推荐
相关产品推荐

