通用函数中的打字稿类型未缩小
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
?
我想这是因为你给了地图类型 ZoneTypes,它可以是其中任何一个。
const a: Map<ZoneTypes, ZoneAndTools["a"]> = new Map();
你应该严格输入它,因为你已经知道 ZoneAndTools
是 a
的类型
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");
以以下类型为例
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
?
我想这是因为你给了地图类型 ZoneTypes,它可以是其中任何一个。
const a: Map<ZoneTypes, ZoneAndTools["a"]> = new Map();
你应该严格输入它,因为你已经知道 ZoneAndTools
是 a
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");