【问题标题】: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 语法允许您指定参数名称。