You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 18:14:56