以下代码中 value 只能推断出是 1 | 2 | 3 。
想问下大佬们,TypeSciprt 目前只不支持在 if(k === 'a')
时推断出 value 为 1 。
或者有没有什么搜索的关键词。查了半天没找到怎么更一步收窄这个类型。
const map = {
a: 1,
b: 2,
c: 3,
} as const;
type Map = typeof map;
function fn<K extends keyof Map>(k: K, value: Map[K]) {
if (k === 'a') {
console.log(value); //value: 1 | 2 | 3
}
if (k === 'b') {
console.log(value);
}
if (k === 'c') {
console.log(value);
}
}
1
renmu 19 天前 via Android
试试 switch ?
|
2
powerfulyang 19 天前 3
const map = {
a: 1, b: 2, c: 3, } as const; type Map = typeof map; type Params = { [K in keyof Map]: { k: K; value: Map[K] } }[keyof Map]; function fn(params: Params) { const {k, value} = params; if (k === 'a') { console.log(value); // value: 1 } else if (k === 'b') { console.log(value); // value: 2 } else if (k === 'c') { console.log(value); // value: 3 } } fn({k: 'a', value: 1}); fn({k: 'b', value: 2}); fn({k: 'c', value: 3}); 感觉现在还没那么强大,换个写法倒是可以? |
3
RIckV2 19 天前 1
type If<C, T, F> = C extends true ? T : F
type MyPick<T, K extends keyof T> = { [P in K]:T[P] } type A = If<k === 'a', MyPick<Map,'1'>,MyPick<Map> > 类似的逻辑,仅供参考 |
4
lisxour 19 天前 1
换 2 楼的写法可以的,这个理论上是能推出来的,靠 ts 更新去支持了
|
5
yandif OP @powerfulyang 感谢大佬,这种写法可以解决我的问题
|
6
kashao 14 天前
学习了
|