为何通过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
相关产品推荐
相关产品推荐

