基于变换函数返回值的打字稿推断

问题描述 投票:0回答:1

让我先建立基本类型(可能是错误的。)>

type TResolver<TData = any, TResolved = TData> = (data: TData) => TResolved

function fetchData<TData = any, TResolved = TData>(
  resolver: TResolver<TData, TResolved>
): Promise<TResolved | null>

核心思想是具有一种利用缓存机制的获取功能,该功能会在获取下一个结果(重新获取或不同的输入)的同时返回先前的结果。最重要的是,解析器可以将数据转换为用于缓存的其他形状,因此转换仅对每个数据运行一次。

type AboutUser = {
  user: {
    name: string
  }
}

fetchData<AboutUser>({ resolver: (data) => data.user }).then(user => {
  // user should be typed properly here
})

Full code in the Playground.

type error

我很清楚,我可以做fetchData<AboutUser, AboutUser["user"]>(...),在这种情况下,可以解决此问题。但是,转换通常要荒唐得多,因此我很想在这里为我提供推理功能。

澄清

作为对https://stackoverflow.com/a/58159700/902813的回应,我想补充一点,实际上有一些自动生成的抽象(基于服务器模式),这些抽象负责生成和附加适当的类型。因此,我宁愿称呼已经带有正确类型的fetchData<AboutUser>而不是fetchUser

如果希望解析器再次指定该类型,那将超出整个目的。

解决

我已经决定使用一种替代方法,该方法利用了某种形式的curing,但仍然感觉很自然。

让我先建立基本类型(可能是错误的)。类型TResolver =(数据:TData)=> TResolved函数fetchData (...

typescript
1个回答
1
投票

将其更改为:

fetchData({ resolver: (data: AboutUser) => data.user }).then(user => {
  // user should be typed properly here
})
© www.soinside.com 2019 - 2024. All rights reserved.