TypeSciprt 类型推断,如何进一步收窄类型?

52 天前
 yandif

以下代码中 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);
  }
}
902 次点击
所在节点    TypeScript
6 条回复
renmu
52 天前
试试 switch ?
powerfulyang
52 天前
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});

感觉现在还没那么强大,换个写法倒是可以?
RIckV2
52 天前
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> >

类似的逻辑,仅供参考
lisxour
51 天前
换 2 楼的写法可以的,这个理论上是能推出来的,靠 ts 更新去支持了
yandif
49 天前
@powerfulyang 感谢大佬,这种写法可以解决我的问题
kashao
46 天前
学习了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1087803

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX