为什么TypeScript中Partial对具体类型生效但不对泛型子类型生效?
报错原因
这个报错是TypeScript泛型约束的正常静态检查逻辑,核心原因是泛型参数M extends Model只限定了M的下限是Model,但M可以是比Model更严格的子类型,存在{ id: string }不符合Partial<M>的合法场景,举个简单的反例:
class CustomModel extends Model { // 把id的类型收窄为固定的字面量联合,比string更严格 id!: "admin" | "guest" // 新增了必填的额外属性 role!: string } // 此时实例化cls,M就是CustomModel const instance = new cls<CustomModel>()
这种场景下Partial<CustomModel>的合法值要求:如果传了id,必须是admin/guest的其中一种,同时如果传了role也必须符合类型要求。你传入的{ id: string }完全可能不符合Partial<M>的类型要求,TypeScript为了保证所有泛型实例化场景的类型安全,就会抛出这个报错。
而yes方法没有报错,是因为它的参数是固定的Partial<Model>,不存在子类型拓展的可能,{ id: string }天然符合这个类型的约束。
修复方案
如果你确认你的业务逻辑里{ id }一定符合Partial<M>的要求,可以直接加类型断言绕过检查:
this.no({ id } as Partial<M>)
如果要保证完全的类型安全,可以调整类的泛型设计,或者给no方法的参数添加额外的兼容约束。
内容的提问来源于stack exchange,提问作者uNmAnNeR
相关产品推荐
相关产品推荐

