条件必填参数
Conditional required parameter
我实际上遇到了一个有趣的问题。
我希望有以下行为:
- 如果 err 为空,则需要结果,因为我 return 它
- 如果 err 不为空,则结果是可选的,因为我会 return 我的错误
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;
我真的不明白为什么会出现这些错误。
事情是,如果我得到一个错误,我永远不会 return 结果并且我之前用 if (err)
验证错误不为空所以我不能 return 无效的。
对于数字也是如此,通过我的扩展,我确信数字永远不会是未定义的...
我觉得是推理的问题。我在做坏事,但我找不到地方。
谢谢 :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')));
}
我实际上遇到了一个有趣的问题。
我希望有以下行为:
- 如果 err 为空,则需要结果,因为我 return 它
- 如果 err 不为空,则结果是可选的,因为我会 return 我的错误
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;
我真的不明白为什么会出现这些错误。
事情是,如果我得到一个错误,我永远不会 return 结果并且我之前用 if (err)
验证错误不为空所以我不能 return 无效的。
对于数字也是如此,通过我的扩展,我确信数字永远不会是未定义的...
我觉得是推理的问题。我在做坏事,但我找不到地方。
谢谢 :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')));
}