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

使用泛型函数为映射类型赋值的TypeScript问题

TypeScript映射类型赋值错误的解决办法

方法一:类型断言

直接通过类型断言明确告诉TypeScript,创建的对象与目标索引的类型匹配:

function assignThingy<T extends Foo>(foo: T) {
  f[foo] = {
    foo: foo,
    bar: 1,
  } as Thingies[T];
}

方法二:辅助函数推导类型

编写一个辅助函数生成符合Thingy<T>类型的对象,让TypeScript自动完成类型推导,无需手动断言:

function createThingy<T extends Foo>(foo: T): Thingy<T> {
  return { foo, bar: 1 };
}

function assignThingy<T extends Foo>(foo: T) {
  f[foo] = createThingy(foo);
}

方法三:使用satisfies关键字(TS 4.9+)

如果你的TypeScript版本在4.9及以上,可利用satisfies确保对象符合类型要求,同时保留具体类型信息:

function assignThingy<T extends Foo>(foo: T) {
  const thingy = {
    foo: foo,
    bar: 1,
  } satisfies Thingy<T>;
  f[foo] = thingy;
}

错误原因

当泛型T为联合类型"a"|"b"时,Thingies[T]会被解析为Thingy<"a"> & Thingy<"b">。由于这两个类型的foo属性分别是"a"和"b",冲突的类型交集会被简化为never,TypeScript因此判定无法给never类型赋值。上述方法都能让TypeScript识别到创建的对象与目标索引的类型严格匹配,从而解决错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 09:52:39