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

为何通过services对象调用TS断言函数会触发错误2775?

为什么通过services对象调用TypeScript断言函数会触发TS错误2775?

TypeScript对断言函数的调用有特殊的类型检查规则:断言函数的调用目标必须有明确的类型注解。

你直接调用assertIsQuerySignOrderStatusRequestDTO时,TypeScript能直接识别它的断言函数身份——毕竟你定义它时,已经用asserts arg is QuerySignOrderStatusRequestDTO明确了它的断言语义。但把它放进services对象后,如果你没给services加显式类型注解,TypeScript会自动推断这个对象的类型,这时候它只会把services.assertIsQuerySignOrderStatusRequestDTO当成普通的返回void的函数,完全丢失了断言函数的特殊语义。

举个实际代码例子,你写的代码大概是这样:

interface QuerySignOrderStatusRequestDTO {
  // 接口字段定义
}

function assertIsQuerySignOrderStatusRequestDTO(arg: unknown): asserts arg is QuerySignOrderStatusRequestDTO {
  // 断言逻辑实现
}

function querySignOrderStatus(dto: QuerySignOrderStatusRequestDTO) {
  // 业务处理逻辑
}

// 没有显式类型的services对象
const services = {
  assertIsQuerySignOrderStatusRequestDTO,
  querySignOrderStatus
};

// 直接调用断言函数,正常通过检查
assertIsQuerySignOrderStatusRequestDTO(someValue);

// 通过services调用,触发TS2775错误
services.assertIsQuerySignOrderStatusRequestDTO(someValue);

这里TypeScript自动推断的services类型是:

{
  assertIsQuerySignOrderStatusRequestDTO: (arg: unknown) => void;
  querySignOrderStatus: (dto: QuerySignOrderStatusRequestDTO) => void;
}

能看到,推断结果里的断言函数已经变成了普通函数,TypeScript没法再识别它的断言作用,所以要求你给services加显式类型注解,明确标注这个属性是断言函数。

要解决这个问题,只需要给services对象添加显式的类型接口:

// 定义services的类型接口
interface Services {
  assertIsQuerySignOrderStatusRequestDTO: (arg: unknown) => asserts arg is QuerySignOrderStatusRequestDTO;
  querySignOrderStatus: (dto: QuerySignOrderStatusRequestDTO) => void;
}

// 给services加上类型注解
const services: Services = {
  assertIsQuerySignOrderStatusRequestDTO,
  querySignOrderStatus
};

这样TypeScript就能正确识别services里的断言函数,调用时就不会再报错了。

内容的提问来源于stack exchange,提问作者Lin Du

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 02:20:37