TypeScript条件类型赋值报错:如何为user属性赋值null?
解决TypeScript条件类型初始赋值报错的问题
你遇到的问题是因为当泛型Ready被指定为true时,user的类型是ClientUser,但初始赋值的null无法匹配这个类型,导致TypeScript报错。可以通过类型断言来解决这个问题,告诉编译器初始值在当前状态下是合法的。
修改后的代码如下:
export class Client<Ready extends boolean = boolean> extends EventEmitter { loggedin: boolean = false; // 使用类型断言指定初始值符合条件类型要求 user: Ready extends true ? ClientUser : Ready extends false ? null : never = null as Ready extends true ? ClientUser : null; isReady(): this is Client<true> { return this.loggedin === true; } }
原理说明
- 初始状态下
loggedin为false,此时user确实是null,但TypeScript无法推断泛型Ready的具体值,所以会检查所有可能的泛型分支。 - 通过
null as Ready extends true ? ClientUser : null断言,我们明确告诉编译器:当Ready为true时,后续会将user赋值为ClientUser类型;当前初始状态的null仅对应Ready为false的分支,从而绕过类型检查。 - 当调用
isReady()方法后,TypeScript会通过类型守卫将this的类型收窄为Client<true>,此时user的类型会自动推断为ClientUser,不会影响后续的类型安全。
另外,如果你希望默认状态下Client的泛型是未登录状态,也可以将泛型默认值改为false,这样初始赋值null就不会报错:
export class Client<Ready extends boolean = false> extends EventEmitter { loggedin: boolean = false; user: Ready extends true ? ClientUser : null = null; isReady(): this is Client<true> { return this.loggedin === true; } }
内容的提问来源于stack exchange,提问作者Durian
相关产品推荐
相关产品推荐

