如何解决打字稿:为什么会有几个没有函数体的函数声明?
我在this GitHub issue of the react-navigation library中发现了以下Typescript代码,该代码中有多个函数声明,但是最后一个声明包含函数体:
export function navigate(
route:
| { key: string; params?: object }
| { name: string; key?: string; params?: object }
): Action;
export function navigate(name: string,params?: object): Action;
export function navigate(...args: any): Action {
if (typeof args[0] === 'string') {
// implementation details...
} else {
// implementation details...
}
}
这是如何工作的?
解决方法
这是一个叫做函数重载的Typescript功能,nicely explained here。
如果参数的类型包含条件运算符(例如联合类型|
),则可以使用它来避免运行时错误。
如果只有一个包含函数体的函数声明(而不是其他两个没有函数体的声明),那将是一件危险的事情,因为any
会在编译时和运行时允许任何操作根据是否发生其他情况,您会遇到错误:
export function navigate(...args: any): Action {
if (typeof args[0] === 'string') {
// implementation details...
} else {
// implementation details...
}
}
很显然,如果开发人员没有其他两个函数声明,则很可能不会使用any
。但是在example of Dr. Axel Rauschmayer中,您会发现,如果将条件作为参数而不是...args: any
来添加,甚至会成问题,
export function navigate(
nameOrRoute:
| string
| { key: string; params?: object }
| { name: string; key?: string; params?: object },params?: object
): any {
if (typeof nameOrRoute === 'string') {
// implementation details...
} else {
// implementation details...
}
}
这将允许在编译时进行多种参数组合,但在某些情况下会在运行时导致错误。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。