能否在Pointer类中实现isPointerReady类型守卫函数,安全访问x、y属性?
问题
能否将this与is关键字结合使用?假设Pointer类中有如下x和y的定义:
x: number | undefined = undefined; y: number | undefined = undefined;
是否可以给该类添加如下函数,从而在客户端代码里安全访问x和y的number类型值?
public isPointerReady(): this.x is number && this.y is number { return this.x !== undefined && this.y !== undefined; }
客户端期望用法:
if (pointer.isPointerReady()) { // 可安全访问pointer.x和pointer.y并将其作为number类型使用 }
解答
你写的这种语法是无效的,TypeScript不支持直接在返回值里用this.x is number && this.y is number这种形式。要实现你想要的类型收窄效果,有两种常用方案:
方案一:定义就绪状态类型,用this is 类型做断言
先定义一个表示指针就绪状态的类型,再在方法返回值里用this is ReadyPointer来做类型谓词:
class Pointer { x: number | undefined = undefined; y: number | undefined = undefined; public isPointerReady(): this is ReadyPointer { return this.x !== undefined && this.y !== undefined; } } // 定义就绪状态的指针类型,覆盖x和y的可选性 type ReadyPointer = Omit<Pointer, 'x' | 'y'> & { x: number; y: number; };
这样当你调用pointer.isPointerReady()并进入if分支后,TypeScript会自动把pointer的类型收窄为ReadyPointer,此时x和y都会被确认为number类型,能直接安全访问。
方案二:直接在类型谓词里拼接就绪类型
如果不想额外定义单独的类型,也可以直接在this is后面拼接出就绪状态的类型:
class Pointer { x: number | undefined = undefined; y: number | undefined = undefined; public isPointerReady(): this is Pointer & { x: number; y: number } { return this.x !== undefined && this.y !== undefined; } }
这种写法和方案一效果完全一致,同样能在if分支里让TypeScript识别出x和y的具体类型。
核心逻辑是:TypeScript的类型谓词要求必须是parameter is Type的形式,类方法里用this作为参数时,就得写成this is Type,不能直接对this的单个属性做零散断言。
内容的提问来源于stack exchange,提问作者John Smith
相关产品推荐
相关产品推荐

