【问题标题】:Typescript, how to require either of two function signatures but no others?打字稿,如何要求两个函数签名中的任何一个而不需要其他函数签名?
【发布时间】:2018-06-02 02:38:02
【问题描述】:

来自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)

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

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

【问题讨论】:

    标签: typescript


    【解决方案1】:
    1. 编译器允许第三次调用 c(undefined),因为默认情况下 TypeScript 类型可以为空。只需启用 strictNullChecks 编译器设置(请参阅 Playground 中的 Options 下拉菜单) - 您会看到调用会产生错误。

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

    【讨论】:

    • 嘿,谢谢,我没有意识到我在 TS 操场上关闭了 strictNullChecks,我希望它默认为完全严格,而不是最不严格。然而,这导致了一个新的但相关的问题。通过严格的空检查,TS 似乎没有实现从函数中的重载中应用知识。 if (typeof error === 'undefined') value.charAt() 没有像我预期的那样将 value 从 string? 缩小到 string。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-28
    • 2018-05-26
    • 1970-01-01
    • 2016-03-31
    • 1970-01-01
    • 1970-01-01
    • 2021-04-12
    相关资源
    最近更新 更多