Typescript可选的通用属性

时间:2019-09-09 19:29:54

标签: typescript generics type-inference typescript-generics

我使用这种类型,其中我的value属性是“可选”的(如果T不是undefined

type AsyncState<T = undefined> = {
    value?: T;
    loading: boolean;
    error: { reason: string } | null;
}

现在,我需要以某种方式创建依赖于AsyncState参数的新对象-如果value不是T则添加undefined属性,如果{{1} }是未定义的。 (这只是更复杂的逻辑的虚拟示例,但是由于类型是有问题的,所以就足够了)

T

这里是typescript playground

1 个答案:

答案 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
      });
}