如何解决有条件的必需参数
我实际上陷入了一个有趣的问题。
我希望有以下行为:
- 如果err为null,则需要结果,因为我将其返回
- 如果err不为null,则结果是可选的,因为我将返回错误
const callback = <ErrorType extends Error | null>(err: ErrorType,result?: (ErrorType extends null ? number : undefined)): Error | number => {
if (err) {
return err;
}
return result;
}
我知道此回调是无用的,但有条件的必需参数很有趣:)
实际上,我有2个错误:
Type 'Error | null' is not assignable to type 'number | Error'.
Type 'null' is not assignable to type 'number | Error'.
Type 'ErrorType' is not assignable to type 'Error'.
Type 'Error | null' is not assignable to type 'Error'.
Type 'null' is not assignable to type 'Error'.
return err;
和
Type '(ErrorType extends null ? number : undefined) | undefined' is not assignable to type 'number | Error'.
Type 'undefined' is not assignable to type 'number | Error'.
return result;
我真的不明白为什么会出现这些错误。
问题是,如果出现错误,我将永远不会返回结果,并且我之前用if (err)
验证了错误不是null,所以我无法返回null。
同样的数字,随着我的扩展,我相信这个数字永远不会是不确定的...
我认为这是一个推理问题。我在做坏事,但找不到。
谢谢:P
解决方法
感谢Aleksey L。
正确的代码是
/**
* Callback type on error
*
* @param err {Error} - Error object
* @param result - No result
* @return Error
*/
function callback(err: Error,result?: undefined): Error;
/**
* Callback type on success
*
* @param err {null} - No error
* @param result {number} - Result
* @return result
*/
function callback(err: null,result: number): number;
function callback(err: any,result: any): any {
if (err) {
return err;
}
return result;
}
function main() {
console.log(callback(null,4));
console.log(callback(new Error('error')));
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。