TypeScript如何编写可接受指定模型扩展类型的自定义类型
解决方案
你需要的自定义Inside类型可以通过构造目标类型的所有属性子集的联合类型实现,既不需要将属性标记为可选携带undefined,也可以匹配所有被目标类型继承的父类型结构:
type AllSubsets<T> = T extends never ? never : ({} extends T ? {} : never) | { [K in keyof T]: Pick<T, K> & AllSubsets<Omit<T, K>> }[keyof T]; type Inside<T> = AllSubsets<T>;
使用示例
interface Resp1Model { a: number } interface Resp2Model { b: string } export interface StateModel extends Resp1Model, Resp2Model {} let someVariable: any; // 和你期望的用法完全一致 let some: Inside<StateModel> = someVariable as Resp2Model; // 类型校验合法 let someOther: Inside<StateModel> = someVariable as Resp1Model; // 类型校验合法 let fullState: Inside<StateModel> = someVariable as StateModel; // 完整类型赋值同样合法
补充说明
- 如果你可以接受属性被显式赋值为
undefined,不需要额外自定义类型,直接使用TypeScript内置的Partial<T>即可满足需求,用法完全相同。 - 如果你的目标类型属性数量较多(超过20个),上述
AllSubsets实现可能存在类型计算性能问题,这种场景推荐开启TypeScript的exactOptionalPropertyTypes编译选项后直接使用Partial<T>,即可实现可选属性不默认包含undefined的效果。
内容的提问来源于stack exchange,提问作者Fatih Ersoy
相关产品推荐
相关产品推荐

