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

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.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 19:10:20