【问题标题】:What is the difference between `(x: number) => void` and `function(number) : void` syntax for parameter types?`(x: number) => void` 和 `function(number) : void` 参数类型的语法有什么区别?
【发布时间】:2022-01-11 20:01:44
【问题描述】:

当创建一个以回调为参数的 javascript 函数时,我可以像这样为 IntelliSense 添加类型:

/**
 * @param {function(number) : void} cb
 */
function takesCallback1(cb) {}

还是这样

/**
 * @param {(x: number) => void} cb
 */
function takesCallback2(cb) {}

这两者有什么区别,应该用在什么情况下?

【问题讨论】:

    标签: typescript intellisense jsdoc


    【解决方案1】:

    function() : 是 JSDoc 语法,而 () => 是 TypeScript 语法。 IntelliSense 都支持两者,但前者仅在 JSDoc cmets 内部支持。

    type TypeScriptSignature = (x: number) => void;
    type JSDocSignature = function(number) : void;
    //                    ^^^^^^^^^^^^^^^^^^^^^^^-JSDoc types can only be used inside
    //                                            documentation comments. TS8020
    

    除此之外,两者之间唯一的显着区别是 TypeScript 语法允许您指定参数的名称。

    如果您将鼠标悬停在this playground link 的两个cb 参数上,您会看到JSDoc 类型转换为Typescript 类型,参数名称设置为arg0

    /**
     * @param {function(number) : void} cb
     */
    function takesCallback1(cb) {}
    //                      ^^
    //                      (arg0: number) => void
    
    /**
     * @param {(x: number) => void} cb
     */
    function takesCallback2(cb) {}
    //                      ^^
    //                      (x: number) => void
    

    那么你应该使用哪一个?如果你使用 JSDoc.app 生成文档,你应该使用 JSDoc 类型。如果您只关心 IntelliSense 是否正确,则任何一种都可以,但 TypeScript 语法允许您指定参数名称。

    【讨论】:

      猜你喜欢
      • 2017-12-05
      • 2012-08-09
      • 2018-08-15
      • 2011-02-15
      • 2017-01-05
      • 1970-01-01
      • 1970-01-01
      • 2011-01-23
      • 2021-12-05
      相关资源
      最近更新 更多