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

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

  •  
  •   yandif · 7 小时 23 分钟前 · 231 次点击

    以下代码中 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);
      }
    }
    
    3 条回复    2024-11-08 16:47:47 +08:00
    renmu
        1
    renmu  
       7 小时 11 分钟前 via Android
    试试 switch ?
    powerfulyang
        2
    powerfulyang  
       6 小时 56 分钟前   ❤️ 2
    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  
       6 小时 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> >

    类似的逻辑,仅供参考
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2468 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 19ms · UTC 15:40 · PVG 23:40 · LAX 07:40 · JFK 10:40
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.