Mobx Generic Observer 使用 Typescript 打字

Mobx Generic Observer using Typescript typing

我想在 mobx 的 observer() 中包装以下函数,但似乎无法弄清楚如何在保持通用类型的同时做到这一点(或者如果可能的话):

interface GenericProps<T> {
  arg: T;
}
const foo: <T>(props: GenericProps<T>) => T = (props) => props.arg;

这是一个全局导出函数,所以使用 @observer 装饰器不是一个选项(我认为),我需要使用来自 mobx-lite-react 的 observer() 函数。

我想要的是这样的东西

interface GenericProps<T> {
  arg: T;
}
const foo = observer<T>((props: GenericProps<T>) => props.arg);

可能与 https://github.com/mobxjs/mobx-react-lite/issues/243 有关,但从谈话中我不清楚我将如何在我的案例中实施通用观察者。

这是你想要的吗?

interface GenericProps<T> {
  arg: T
}

const foo = <T extends IReactComponent>(props: GenericProps<T>) => observer(props.arg)

我不太明白,因为在第一个例子中你有函数 returns 另一个函数,但在第二个例子中你只是将函数传递给 observer 但这是不可能的,因为只有观察者接受扩展 IReactComponent

的东西
  1. 你的示例不是react组件,你需要匹配React.FunctionComponent接口
const foo_1: <T>(props: GenericProps<T>) => React.ReactElement | null = (props) => <>{JSON.stringify(props.arg)}</>;
  1. 添加观察者(由于 TS 3.4 或 3.5 的改进,这应该已经可以工作了)
const foo_2: <T>(props: GenericProps<T>) => React.ReactElement | null = observer((props) => <>{JSON.stringify(props.arg)}</>);
  1. 如果在旧的 TS 上你需要将类型声明移动到函数本身(注意 extends unknown 告诉编译器这是通用定义而不是 JSX 标签,return 类型不需要被指定,因为它将被推断)
const foo_3 = observer(<T extends unknown>(props: GenericProps<T>) => <>{JSON.stringify(props.arg)}</>);