Typescript 条件必需参数

Typescript 条件必需参数,typescript,type-inference,typescript-generics,Typescript,Type Inference,Typescript Generics,实际上我被一个有趣的问题困住了 我希望有以下行为: 若err为null,那个么结果是必需的,因为我返回了它 若err不为null,那个么result是可选的,因为我将返回我的错误 及 我真的不明白为什么我会犯这些错误 问题是,如果我得到了一个错误,我将永远不会返回结果,我之前用if(err)验证错误不是null,所以我不能返回null。 数字也是一样,有了我的扩展,我确信这个数字永远不会被定义 我认为这是一个推理的问题。我在做坏事,但我找不到地方 谢谢:p谢谢Aleksey L 正确的代码是

实际上我被一个有趣的问题困住了

我希望有以下行为:

  • 若err为null,那个么结果是必需的,因为我返回了它
  • 若err不为null,那个么result是可选的,因为我将返回我的错误

我真的不明白为什么我会犯这些错误

问题是,如果我得到了一个错误,我将永远不会返回结果,我之前用
if(err)
验证错误不是null,所以我不能返回null。 数字也是一样,有了我的扩展,我确信这个数字永远不会被定义

我认为这是一个推理的问题。我在做坏事,但我找不到地方

谢谢:p

谢谢Aleksey L

正确的代码是

/**
 * Callback type on error
 * 
 * @param err {Error} - Error object
 * @param result - No result
 * @return Error 
 */
function callback(err: Error, result?: undefined): Error;

/**
 * Callback type on success
 * 
 * @param err {null} - No error
 * @param result {number} - Result
 * @return result
 */
function callback(err: null, result: number): number;

function callback(err: any, result: any): any {
    if (err) {
        return err;
    }
    return result;
}

function main() {
    console.log(callback(null, 4));
    console.log(callback(new Error('error')));
}
请看一下重载是否工作正常,谢谢
  Type 'Error | null' is not assignable to type 'number | Error'.
    Type 'null' is not assignable to type 'number | Error'.
      Type 'ErrorType' is not assignable to type 'Error'.
        Type 'Error | null' is not assignable to type 'Error'.
          Type 'null' is not assignable to type 'Error'.

     return err;

Type '(ErrorType extends null ? number : undefined) | undefined' is not assignable to type 'number | Error'.
  Type 'undefined' is not assignable to type 'number | Error'.

  return result;
/**
 * Callback type on error
 * 
 * @param err {Error} - Error object
 * @param result - No result
 * @return Error 
 */
function callback(err: Error, result?: undefined): Error;

/**
 * Callback type on success
 * 
 * @param err {null} - No error
 * @param result {number} - Result
 * @return result
 */
function callback(err: null, result: number): number;

function callback(err: any, result: any): any {
    if (err) {
        return err;
    }
    return result;
}

function main() {
    console.log(callback(null, 4));
    console.log(callback(new Error('error')));
}