【问题标题】:How to remove a parameter when the 'T' generic type is 'void'?当'T'泛型类型为'void'时如何删除参数?
【发布时间】:2019-05-01 11:39:09
【问题描述】:

我尝试在下面的代码中定义resolve 回调的类型。

第一次尝试:只是通用

export interface PromiseToHandle<T> {
  resolve: (result: T) => void  // <----- The question is about that line
  reject: (error: any) => void
  promise: Promise<T>
}

export function promiseToHandle<T = any>(): PromiseToHandle<T> {
  let resolve!: any;
  let reject!: (error: any) => void;
  const promise = new Promise<T>((resolveCb, rejectCb) => {
    resolve = resolveCb;
    reject = rejectCb;
  });
  return { promise, resolve, reject };
}

const pth1 = promiseToHandle<boolean>();
pth1.resolve(true); // OK

const pth2 = promiseToHandle<void>();
pth2.resolve(); // OK

它按我需要的方式工作,但是类型不正确:

const pth3 = promiseToHandle<void>();
const voidResolve: () => void = pth3.resolve // Error: Type '(result: void) => void' is not assignable to type '() => void'.

第二次尝试:使用条件类型

export interface PromiseToHandle<T> {
  resolve: T extends void ? () => void : (result: T) => void
  reject: (error: any) => void
  promise: Promise<T>
}

const pth4 = promiseToHandle<void>();
const voidResolve2: () => void = pth4.resolve // OK

上一个问题解决了。但是现在主要情况不起作用:

const pth5 = promiseToHandle<boolean>();
pth5.resolve(true); // Error: Argument of type 'true' is not assignable to parameter of type 'false & true'.

我不知道为什么,但是当使用条件类型时,联合(booleanfalse | true)被转换为交集(false &amp; true)!

【问题讨论】:

    标签: typescript generics void conditional-types


    【解决方案1】:

    你的条件类型解决方案不错,你只需要禁用条件类型的分布行为

    export interface PromiseToHandle<T> {
      resolve: [T] extends [void] ? () => void : (result: T) => void
      reject: (error: any) => void
      promise: Promise<T>
    }
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-12-06
    • 1970-01-01
    • 2020-08-22
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多