学习TypeScript遇到术语arity不理解,求其计算机领域定义及文档说明
术语arity的定义
arity(元数)是计算机领域用来描述函数接收的参数数量的术语:
- 不接收参数的函数arity为0,也叫零元函数
- 接收1个参数的函数arity为1,也叫一元函数
- 接收2个参数的函数arity为2,也叫二元函数,以此类推
TypeScript文档片段解释
这段是TypeScript类型声明编写规范中关于「重载与回调」的注意事项,核心规则如下:
错误写法说明
不要编写仅在回调arity上存在差异的独立重载:
/* WRONG */ declare function beforeAll(action: () => void, timeout?: number): void; declare function beforeAll( action: (done: DoneFn) => void, timeout?: number ): void;
这种写法完全多余,还会引入类型安全隐患:
- 在JavaScript/TypeScript中,回调忽略传入的参数是完全合法的行为:哪怕你要求回调是接收1个
done参数的类型,用户传入无参的回调也完全符合要求,不需要单独为无参回调写一个重载 - 重载是按从上到下的顺序匹配的,把无参回调的重载放在前面,会导致一些不符合预期的函数也能通过类型校验。比如用户传入一个接收
number类型参数的回调,会优先匹配到第一个无参回调的重载,TypeScript不会报错,但实际运行时beforeAll会给回调传入DoneFn类型的参数,就会出现类型不匹配的运行时问题。
正确写法说明
请使用最大arity编写单个重载:
/* OK */ declare function beforeAll( action: (done: DoneFn) => void, timeout?: number ): void;
只写要求回调arity最大的那一个重载就足够:既兼容用户不传done参数的无参回调场景,又能避免前面提到的类型匹配漏洞。
内容的提问来源于stack exchange,提问作者JAYD3V
相关产品推荐
相关产品推荐

