如何在TypeScript中编写通用类型将Record转为as const等效类型?
实现无需
as const的readonly字面量类型推导 你需要让变量声明时,无需手动添加as const,就能让TypeScript自动推导对象的readonly字面量类型,同时符合Record<string, string>的约束。
推荐实现方式
利用TypeScript的const泛型参数特性,写一个辅助函数来实现需求:
// 定义你的基础类型 type MyType = Record<string, string>; // 实现工具函数,自动推导字面量并添加readonly const createModified = <const T extends MyType>(obj: T): Readonly<T> => obj; // 使用示例 const foo = createModified({ myKey: 'myValue' }); // typeof foo 为 { readonly myKey: 'myValue' }
这个函数的const泛型参数会强制TypeScript将传入的对象字面量推导为字面量类型(而非宽泛的string),同时返回值被标记为Readonly<T>,完美匹配你要的效果,而且不需要手动写as const。
纯类型层面的限制
如果尝试纯类型修饰符(即仅通过type Modify<T>实现),目前TypeScript的类型系统无法直接阻止对象字面量的类型拓宽——默认情况下,当上下文类型是Record<string, string>时,TypeScript会自动把键和值拓宽为string类型,无法自动推导字面量。因此辅助函数是当前最简洁可行的方案。
内容的提问来源于stack exchange,提问作者Sennen Randika
相关产品推荐
相关产品推荐

