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

typescript 类型推导的问题

  •  
  •   liumingyi1 · 2021-01-12 13:55:01 +08:00 · 1684 次点击
    这是一个创建于 1446 天前的主题,其中的信息可能已经有所发展或是发生改变。

    能正常推导的例子

    function createStore<R, E extends Record<string, (arg: R) => void>>(reducers: R, effects: E) {}
    
    createStore(
      {
        hello() {},
      },
      {
        world(arg) {
          // 这里能自动推导 arg: { hello(): void }
          arg.hello();
        },
      },
    );
    
    

    我封装库需要写成以下参数形式

    function createStore<
      R,
      E extends Record<string, (arg: R) => void>
    >(store: { reducers: R; effects: E }) {}
    
    createStore({
      reducers: {
        hello() {},
      },
      effects: {
        world(arg) {
          // 这里无法推导 TS2571: Object is of type 'unknown'.
          arg.hello();
        },
      },
    });
    
    
    

    有没有办法让下面这种 store 对象参数形式也支持类型自动推导?

    1 条回复    2021-04-16 17:38:02 +08:00
    youmoo
        1
    youmoo  
       2021-04-16 17:38:02 +08:00
    后一个 createStore 之所以报错,是因为它无法推导出 R 的实际类型,我发现这样调用就行了:

    ```js
    createStore({
    reducers: {
    hello() { },
    } as const,
    effects: {
    world(arg) {
    arg.hello();
    },
    },
    });
    ```

    https://www.typescriptlang.org/play?#code/GYVwdgxgLglg9mABBATgUwIZTQZSndAHgChFEAlAGlMQFFE0APbMAEwGcK0IDXD2oKGGADmlRAAoMKEQC4KASkQBeAHyIAbnBitVxVRIEE08gN6J0rEBDQp288gG4GwYNyj26iAL5Lz34kDUTGw8YwlTGktrW09IsjIACzQAGxS4CT8fajJvRAxOHjABHJc3aDiaMgB3AhTWKRk-KoTpEQA6ZLSMhUcW71KB4l8+oA
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2878 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 33ms · UTC 08:15 · PVG 16:15 · LAX 00:15 · JFK 03:15
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.