【问题标题】:How do I call this TypeScript method that has an optional argument?如何调用这个具有可选参数的 TypeScript 方法?
【发布时间】:2016-07-31 15:47:47
【问题描述】:

VSCode Position 类有两个方法,如下所示:

translate(lineDelta?: number, characterDelta?: number): Position
translate(change: {characterDelta: number, lineDelta: number}): Position

我想称之为只提供一个字符增量。我试过这样做:

let endPos = startPos.translate(characterDelta: error.location.length);

但是我得到了这个错误:

Cannot find name 'characterDelta'.

我认为? 在第一个重载的参数上的目的意味着它们是可选的,我可以提供我需要的那个。不是这样吗?

【问题讨论】:

    标签: typescript optional-parameters


    【解决方案1】:

    调用方法时不命名参数,但根据签名还需要提供第一个可选参数,所以应该是这样的:

    let lineDelta: number = ...
    let endPos = startPos.translate(lineDelta, error.location.length);
    

    或者:

    let characterDelta: number = ...
    let endPos = startPos.translate({
        characterDelta: characterDelta, 
        lineDelta : error.location.length
    });
    

    可选参数可能是可选的,但如果你想传递第二个可选参数,那么你还需要传递第一个。
    所以这些是有效的(根据签名):

    startPos.translate();
    startPos.translate(lineDelta);
    startPos.translate(lineDelta, characterDelta);
    

    【讨论】:

    • 那么在这种情况下,第一个参数被标记为可选的意义何在? (调用 translate 方法不进行翻译是没有意义的,甚至记录为只是返回this):-/
    • 好问题,我不知道,也许设计这个api的人认为也许有一些场景很方便。
    【解决方案2】:

    它需要一个具有 characterDeltalineDelta 属性的对象。

    let endPos = startPos.translate({characterDelta: error.location.length, lineDelta: 5});
    

    【讨论】:

    • 第二个重载确实如此,但我试图使用第一个 (translate(lineDelta?: number, characterDelta?: number): Position)
    猜你喜欢
    • 2019-10-22
    • 1970-01-01
    • 1970-01-01
    • 2011-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-02
    • 2013-07-03
    相关资源
    最近更新 更多