V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
yandif
V2EX  ›  TypeScript

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

  •  
  •   yandif · 13 天前 · 548 次点击

    以下代码中 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);
      }
    }
    
    6 条回复    2024-11-14 11:34:35 +08:00
    renmu
        1
    renmu  
       13 天前 via Android
    试试 switch ?
    powerfulyang
        2
    powerfulyang  
       13 天前   ❤️ 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});

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

    类似的逻辑,仅供参考
    lisxour
        4
    lisxour  
       12 天前   ❤️ 1
    换 2 楼的写法可以的,这个理论上是能推出来的,靠 ts 更新去支持了
    yandif
        5
    yandif  
    OP
       10 天前
    @powerfulyang 感谢大佬,这种写法可以解决我的问题
    kashao
        6
    kashao  
       7 天前
    学习了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   4686 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 20ms · UTC 09:57 · PVG 17:57 · LAX 01:57 · JFK 04:57
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.