TypeScript中如何实现校验失败抛错、通过返回void的类型谓词函数
实现方案
你要的这类失败抛错、通过时无返回的类型校验函数,是 TypeScript 3.7 版本就原生支持的类型断言函数,有专门的语法实现,不需要自己写条件返回类型。
你之前写的value extends string ? void : never的返回类型定义无法编译,本质是因为这种自定义条件类型没法和TS的控制流分析绑定,TS识别不到函数内部校验逻辑和参数类型收窄的关联关系。
正确代码
直接使用TS内置的asserts谓词签名即可:
function assertString(value: unknown): asserts value is string { if (typeof value !== 'string') { throw new Error('string expected'); } }
效果说明
- 当入参不是字符串时,函数直接抛出异常终止流程,TS会自动识别后续代码不可达,不会出现类型问题
- 当校验通过时,函数不需要返回任何值(默认返回
undefined,符合void返回要求),函数执行完成后,TS会自动把入参value的类型收窄为string,收窄效果和返回布尔值的普通类型守卫完全一致。
使用示例
const rawValue: unknown = "demo text"; assertString(rawValue); // 此处rawValue已经被推断为string类型,可以直接调用字符串方法 console.log(rawValue.toUpperCase());
和普通类型守卫的差异
你之前实现的isString属于返回布尔值的类型守卫,用value is string标记返回类型,适合需要走分支判断的场景;而断言函数用asserts value is string标记返回类型,专门适配前置校验、不满足条件直接中断逻辑的场景,完全匹配你的使用需求。
内容的提问来源于stack exchange,提问作者Martin Ždila
相关产品推荐
相关产品推荐

