TypeScript求助:如何从对象键推断字符串字面量类型?
解决方案:基于键格式动态约束值类型
问题根源
你之前定义的Values类型用了[K in string]索引签名,这里的K是通用的string类型,而非对象的具体键字面量。由于string并不属于$${string}类型(不是所有字符串都以$开头),条件类型会返回null,最终Values等价于{ [key: string]: null },导致所有键的值都被要求为null,这就是报错的核心原因。
正确实现方式
我们需要用泛型映射类型捕获对象的具体键字面量,对每个键单独判断格式并生成对应的值类型:
// 泛型类型:接收键的字面量联合类型T,为每个键匹配对应的值类型 type ValidValues<T extends string> = { readonly [K in T]: K extends `$${infer P}` ? P : null; };
然后用satisfies约束对象,同时让TypeScript自动推断键的字面量类型:
const values = { $foo: 'foo', foo: null, $boo: 'boo', boo: null, } satisfies ValidValues<keyof typeof values>;
验证结果
此时values的类型会被自动推断为你期望的结构:
type InferredType = typeof values; // 等价于: // { // readonly $foo: "foo"; // readonly foo: null; // readonly $boo: "boo"; // readonly boo: null; // }
可选简化方式
如果不想用satisfies,也可以用辅助函数自动推断类型:
function createValues<T extends string>(obj: ValidValues<T>) { return obj; } const values = createValues({ $foo: 'foo', foo: null, $boo: 'boo', boo: null, });
内容的提问来源于stack exchange,提问作者Stephan D.
相关产品推荐
相关产品推荐

