TypeScript中如何原生断言变量的推断类型?
优雅断言TypeScript变量推断类型的方案
我一直在用一个空操作的assertType函数来断言变量的推断类型:
function assertType<T>(value: T) { /* 无实际逻辑 */ } assertType<SomeType>(someValue);
这个方法在确保覆盖函数返回的所有联合类型分支时特别实用,比如:
function doSomething(): "ok" | "error" { /* 函数实现 */ } const result = doSomething(); if (result === "error") { return; } assertType<"ok">(result); // 后续代码只会在result为"ok"时执行
一旦给"ok" | "error"这类联合类型新增变体(比如"timeout"),这个断言就会触发类型错误,帮我及时发现未处理的分支。
但我不想依赖这种空操作函数,希望用原生语法实现类似效果,比如设想的写法:
if (result === "error") { return; } <"ok">result // 期望的原生语法 // 执行后续操作
原生语法替代方案
TypeScript目前没有完全匹配上述设想的语法,但有两种更简洁的原生方式可以实现相同的编译时检查效果,且无运行时开销:
使用
satisfies运算符(TypeScript 4.9及以上)
这是最接近需求的方案,satisfies会检查值是否符合指定类型,同时保留变量原有的推断类型:if (result === "error") { return; } result satisfies "ok"; // 后续代码可安全假设result为"ok"当
result的类型不是"ok"时,TypeScript会直接抛出类型错误。利用类型断言结合
never做编译时检查
可以通过定义一个辅助类型来实现:type Assert<T extends true> = T; // 使用时 const _: Assert<typeof result extends "ok" ? true : false> = true;这种方式同样能在
result类型不符合预期时触发错误,且不需要额外函数。
内容的提问来源于stack exchange,提问作者Nicolas Mattia
相关产品推荐
相关产品推荐

