如何在单个场景下规避TypeScript的noUncheckedIndexedAccess检查
解决noUncheckedIndexedAccess下Proxy对象的类型推断问题
启用noUncheckedIndexedAccess编译选项后,TypeScript会为所有索引签名自动添加undefined作为可能的返回类型。但如果你用Proxy实现了兜底返回默认值的逻辑(确保任何索引访问都不会返回undefined),可以通过以下方法让TS识别Proxy对象的成员类型为非undefined的原始类型,且无需关闭该编译选项。
方法一:直接类型断言
定义一个移除了undefined的索引类型,再将Proxy实例断言为该类型:
type Type = { [k: string]: string }; const obj: Type = {}; // 定义安全索引类型:确保所有键返回非undefined值 type SafeType = { [k: string]: NonNullable<Type[string]> }; const p = new Proxy(obj, { get: (_, k) => { return '_' + String(k); }, }) as SafeType; p.hello; // TS识别类型为string
方法二:封装泛型工具函数
如果需要多次创建这类Proxy,可以封装一个泛型函数,自动推导安全类型:
type Type = { [k: string]: string }; const obj: Type = {}; // 泛型工具类型:将索引签名的类型转为非nullable type SafeIndexedType<T extends { [k: string]: any }> = { [K in keyof T]: NonNullable<T[K]>; } & { [k: string]: NonNullable<T[string]>; }; // 封装创建安全Proxy的函数 function createSafeProxy<T extends { [k: string]: any }>(target: T) { return new Proxy(target, { get: (_, k) => { return '_' + String(k); }, }) as SafeIndexedType<T>; } const p = createSafeProxy(obj); p.hello; // TS识别类型为string
关键说明
直接写type Type = {[k: string]: NonNullable<string>}无法生效,因为noUncheckedIndexedAccess会强制为所有索引签名追加undefined,必须通过类型断言或工具类型覆盖TS的自动推断。同时要确保Proxy的运行时逻辑确实不会返回undefined,否则会出现类型与运行时不一致的风险。
内容的提问来源于stack exchange,提问作者sebpiq
相关产品推荐
相关产品推荐

