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

TypeScript:如何约束泛型N为字符串键字典的键且符合string类型

TypeScript泛型键约束问题解决方案

问题场景

当字典类型的键被约束为string时,TypeScript中keyof D类型的泛型仍会被推断为string | number | symbol。示例代码如下:

type Foo = {
  [key: string]: any
}

const bar = (blah: string) => {
  return blah;
}

const foo = <T extends Foo, N extends keyof T>(dict: T, key: N) => {
  bar(key); // 错误:类型'number'不能赋值给类型'string'
  console.log(dict);
}

此时需要约束泛型N,使其既能传入要求string类型参数的bar函数,又必须是字典T的有效键之一。

解决方案

通过交集类型对泛型N进行双重约束,同时限定其为string类型和T的键:

修改后的代码

type Foo = {
  [key: string]: any
}

const bar = (blah: string) => {
  return blah;
}

const foo = <T extends Foo, N extends keyof T & string>(dict: T, key: N) => {
  bar(key); // 无报错,N同时满足是T的键且为string类型
  console.log(dict);
}

原理

  • keyof T & string表示取keyof T与string的交集,自动排除number和symbol类型的键,确保N是string类型,符合bar函数的参数要求。
  • N extends keyof T保证了N一定是字典T的有效键,不会出现无效键传入的问题。

你也可以调换交集顺序,效果完全一致:

const foo = <T extends Foo, N extends string & keyof T>(dict: T, key: N) => {
  bar(key);
  console.log(dict);
}

内容的提问来源于stack exchange,提问作者theahura

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 07:40:34