让我先建立基本类型(可能是错误的。)>
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
})
我很清楚,我可以做fetchData<AboutUser, AboutUser["user"]>(...)
,在这种情况下,可以解决此问题。但是,转换通常要荒唐得多,因此我很想在这里为我提供推理功能。
澄清
作为对https://stackoverflow.com/a/58159700/902813的回应,我想补充一点,实际上有一些自动生成的抽象(基于服务器模式),这些抽象负责生成和附加适当的类型。因此,我宁愿称呼已经带有正确类型的fetchData<AboutUser>
而不是fetchUser
。
如果希望解析器再次指定该类型,那将超出整个目的。
解决
我已经决定使用一种替代方法,该方法利用了某种形式的curing,但仍然感觉很自然。
让我先建立基本类型(可能是错误的)。类型TResolver
将其更改为:
fetchData({ resolver: (data: AboutUser) => data.user }).then(user => {
// user should be typed properly here
})