通用函数中的打字稿类型未缩小

Typescript type not narrowed in generic function

以以下类型为例

type ZoneAndTools = {
    a: number,
    b: string,
    c: object,
}

type ZoneTypes = keyof ZoneAndTools;

应用于此功能,我正在寻找从地图中提取类型

function transform<T extends ZoneTypes>(
    map: Map<T, ZoneAndTools[T]>,
    key: T
): ZoneAndTools[T] | undefined {
    return map.get(key);
}

这是一个用例:

const a: Map<ZoneTypes, ZoneAndTools[ZoneTypes]> = new Map();
const b = transform(a, 'a');
// b is string | number | object | undefined instead of number | undefined

我想问专家,为什么这个用例中的转换函数没有 return number> | undefined

Playground

我想这是因为你给了地图类型 ZoneTypes,它可以是其中任何一个。

const a: Map<ZoneTypes, ZoneAndTools["a"]> = new Map();

你应该严格输入它,因为你已经知道 ZoneAndToolsa

的类型
const a: Map<"a", ZoneAndTools["a"]> = new Map();

您还可以进一步输入并为 ZoneAndTools

创建自定义 Map
type ZoneAndTools = {
  a: number;
  b: string;
  c: object;
};

type ZoneTypes = keyof ZoneAndTools;

function transform<T extends ZoneTypes>(
  map: Map<T, ZoneAndTools[T]>,
  key: T
): ZoneAndTools[T] | undefined {
  return map.get(key);
}

type ZoneMap<T extends ZoneTypes> = Map<T, ZoneAndTools[T]>

const a: ZoneMap<"a"> = new Map();
const b = transform(a, "a");