typescript 类型推导的问题

2021-01-12 13:55:01 +08:00
 liumingyi1

能正常推导的例子

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 对象参数形式也支持类型自动推导?

1480 次点击
所在节点    TypeScript
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

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

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

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

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

© 2021 V2EX