如何不使用临时变量对表达式进行静态类型检查?
无临时变量实现TypeScript严格类型检查
假设有一个来自JS库的函数,它的参数被定义为any类型(或现有类型无法满足校验需求),同时我们自定义了一个接口:
// f 是来自某个JS库的函数 const f = (x: any) => console.log(x); interface SpecificObject { a: string; b: string; }
如果用临时变量传递参数,编译器能正确检测出字面量的类型问题:
const tmpVar: SpecificObject = {a: ""}; f(tmpVar);
这段代码会报错,提示字面量缺少b属性,但缺点是多了一个不必要的临时变量tmpVar。
如果直接用类型断言:
f({a: ""} as SpecificObject);
编译器不会报错,因为as是强制类型断言,会跳过严格的类型校验,达不到预期的检查效果。
下面是几种无需临时变量的解决方案:
方案1:使用satisfies关键字(TS 4.9+)
这是最简洁的方式,satisfies会检查表达式是否符合指定类型,但不会改变表达式的原始类型,同时能触发严格的类型校验:
f({a: ""} satisfies SpecificObject);
这段代码会直接报错,提示缺少b属性,完全符合需求且无额外变量。
方案2:用辅助函数做类型校验
定义一个简单的泛型辅助函数,用来对传入值做类型检查:
const assertType = <T>(val: T): T => val; f(assertType<SpecificObject>({a: ""}));
辅助函数会对传入的字面量做严格类型检查,不符合时直接报错,同时返回原类型,不会产生额外运行时开销。
方案3:给函数绑定严格类型
如果需要多次调用这个函数,可以给它重新绑定一个严格类型:
type TypedF = (x: SpecificObject) => void; const typedF = f as TypedF; typedF({a: ""}); // 此处会报错,提示缺少b属性
这种方式只需要做一次类型转换,后续调用typedF时都能自动享受类型校验,适合频繁调用的场景。
内容的提问来源于stack exchange,提问作者nog642
相关产品推荐
相关产品推荐

