参数类型的`(x: number) => void` 和`function(number) : void` 语法有什么区别?

What is the difference between `(x: number) => void` and `function(number) : void` syntax for parameter types?

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

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

或类似

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

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

function() : 是 JSDoc 语法,而 () => 是 TypeScript 语法。两者均受 IntelliSense 支持,但前者仅在 JSDoc 注释中受支持。

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 类型已转换为参数名称设置为 arg0 的 Typescript 类型。

/**
 * @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 语法允许您指定参数名称。