能否在TypeScript中使用is关键字缩小类属性的类型?
如何用类型谓词缩小类属性的类型?
你当前的写法没法让TypeScript正确收缩name属性的类型,因为TypeScript不支持直接将this.name is string作为方法的返回类型谓词。要实现类属性的类型收缩,需要通过收缩this实例的整体类型来达成。
正确实现方式
通过this is { name: string }这样的类型谓词,告诉TypeScript当hasName()返回true时,当前实例的name属性必然是string类型:
class Person { name: string | undefined; hasName(): this is { name: string } { return this.name !== undefined && this.name !== ""; } } const me = new Person(); if (me.hasName()) { // 此处不再报错,TypeScript已识别name为string类型 console.log(me.name.includes("a")); }
进阶:复用类型定义
如果需要在多个地方复用这个收缩后的类型,可以提前定义接口,让类型谓词更清晰:
interface NamedPerson { name: string; } class Person { name?: string; // 等价于 string | undefined hasName(): this is NamedPerson { return this.name !== undefined && this.name !== ""; } }
原理说明
TypeScript的类型谓词仅支持两种场景:
- 针对函数参数的收缩(比如
arg is string) - 针对
this自身的类型收缩(比如this is XXX)
直接写this.name is string不在支持范围内,所以通过声明this符合包含明确name: string的类型,就能间接完成属性的类型收缩。
内容的提问来源于stack exchange,提问作者Ryve
相关产品推荐
相关产品推荐

