打字稿,如何要求两个函数签名中的任何一个而不是其他函数签名?

时间:2018-06-01 17:43:54

标签: typescript

来自Typescript, require either of two function signatures

的问题

我的代码得到一个回调,我希望 传递错误,或者保留第一个参数未定义并将数据作为第二个参数传递。

我已定义了一个界面来描述以下内容:

type Callback = {
  (error: undefined, value: string): void;
  (error: Error): void;
}

function doThings(c: Callback) {
    // Valid, no error, and a useful value.
    c(undefined, '1');
    // Valid, something went wrong, so we pass in an error, but no value.
    c(new Error());

    // Not valid, but accepted by TS playground:
    c(undefined);
}

function cOverload(error: undefined, value: string): void;
function cOverload(error: Error): void;
function cOverload(error: undefined | Error, value?: string) { }

doThings(cOverload)

我对这段代码有两个问题,我认为这两个问题归结为我如何定义函数签名。

    TS不会将
  1. c(undefined);视为错误,但我希望它是。
  2. 在cOverload的实现中,value被视为string。我不需要检查它的类型,TS很高兴我有一个像{ value.charAt(0); }这样的函数体,而我希望它抱怨值可能是未定义的。

1 个答案:

答案 0 :(得分:2)

  1. 编译器允许第3次调用c(undefined),因为默认情况下TypeScript类型可以为空。只需启用 strictNullChecks 编译器设置(请参阅Playground中的选项下拉列表) - 您将看到调用将生成错误。

  2. 我想与第一个答案类似 - strictNullChecks 会有所帮助。