✈ 类型安全的扁平化的 try-catch,支持同步函数、回调函数和 PromiseLike
// 需要先在 try-catch 块级作用域外定义变量,此处还需要先声明类型
let res: Result | undefined;
try {
// 块级作用域内赋值
res = await somePromise;
} catch (err) {
console.log(err);
return;
}
// try-catch 块级作用域快使用该变量
// 因为 res 类型包含 undefined,所以还要加有值判断
if (res) {
console.log(res.prop);
}
const [err, res] = await somePromise;
// 只需要判断 err 是否存在即可
if (err) {
// 此处 err 类型为 Error,res 类型为 undefined
console.log(err);
console.log(res === undefined);
return;
}
// 此处 err 类型为 null,res 类型为 Result
console.log(err === null);
console.log(res.prop);
npm install try-flatten
const [err, res] = tryFlatten(() => 1);
// 只需要判断 err 是否存在即可
if (err) {
// 此处 err 类型为 Error,res 类型为 undefined
console.log(err instanceof Error);
console.log(res === undefined);
return;
}
// 此处 err 类型为 null,res 类型为 number
console.log(err === null);
console.log(res === 1);
const [err, res] = await tryFlatten((callback: (err: Error | null, res: number) => void) => {
callback(null, 1);
});
// 只需要判断 err 是否存在即可
if (err) {
// 此处 err 类型为 Error,res 类型为 undefined
console.log(err instanceof Error);
console.log(res === undefined);
return;
}
// 此处 err 类型为 null,res 类型为 number
console.log(err === null);
console.log(res === 1);
const [err, res] = await tryFlatten(Promise.resolve(1));
// 只需要判断 err 是否存在即可
if (err) {
// 此处 err 类型为 Error,res 类型为 undefined
console.log(err instanceof Error);
console.log(res === undefined);
return;
}
// 此处 err 类型为 null,res 类型为 number
console.log(err === null);
console.log(res === 1);