我使用这种类型,其中我的value
属性是“可选”的(如果T
不是undefined
)
type AsyncState<T = undefined> = {
value?: T;
loading: boolean;
error: { reason: string } | null;
}
现在,我需要以某种方式创建依赖于AsyncState
参数的新对象-如果value
不是T
则添加undefined
属性,如果{{1} }是未定义的。 (这只是更复杂的逻辑的虚拟示例,但是由于类型是有问题的,所以就足够了)
T
答案 0 :(得分:1)
您可以通过将需要推断T
的 actual 类型的返回函数设为泛型来解决此问题。
function asyncGet<T>(initialState: AsyncState<T>) {
return typeof initialState.value !== "undefined"
? (s: AsyncState<T>) => ({ ...initialState })
: <U>(s: AsyncState<U>) => ({
loading: initialState.loading,
error: initialState.error
});
}
也就是说,如果您试图通过这样调用TypeScript的推论来覆盖它,这将给您带来麻烦:asyncGet<string>({ loading: true, error: null })
更好的解决方案是使用条件类型来指定该函数有条件地使用对返回的函数的调用的推断值。
function asyncGet<T>(initialState: AsyncState<T>):
<U>(s: AsyncState<[T] extends [undefined] ? U : T>) =>
AsyncState<[T] extends [undefined] ? U : T> {
return typeof initialState.value !== "undefined"
? (s) => ({ ...initialState })
: (s) => ({
loading: initialState.loading,
error: initialState.error
});
}