You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 08:28:33