我编写了以下函数来帮助处理错误
const capture = <T>(
callback: () => T
): { result?: T; error?: Error } => {
try {
return { result: callback(), error: undefined };
} catch (err) {
return { result: undefined, error: err as Error };
}
};
Run Code Online (Sandbox Code Playgroud)
用法示例:
const { result, error } = capture<number>(() => foo());
if (error) badPath();
console.log("hooray we got a result", result)
Run Code Online (Sandbox Code Playgroud)
然而 TypeScript 编译器会抱怨:
Object is possibly 'undefined'. ts(2532)
const result: number | undefined
Run Code Online (Sandbox Code Playgroud)
我理解为什么编译器会抱怨(这是使用可选参数的预期行为)。
然而我想知道是否存在一些可以支持条件返回类型的 TypeScript 恶作剧。
即我们有没有办法指定capture …
我下面有一个简单的程序,它试图打印String从硬编码Vec通过创建的String::from_utf8。
我还在这里使用类型别名来减少冗长(例如Result<String, SomeError>vs Result<String>)
use std::error;
use std::result;
pub type Error = Box<dyn error::Error>;
pub type Result<T> = result::Result<T, Error>;
fn main() {
let vec = vec![65; 3];
let text = String::from_utf8(vec).unwrap();
println!("result {}", text);
}
fn foo() -> Result<String> {
let vec = vec![65; 3];
String::from_utf8(vec)
}
Run Code Online (Sandbox Code Playgroud)
但是该程序无法编译,我收到此错误:
|
26 | fn foo() -> Result<String> {
| -------------- expected `std::result::Result<String, Box<(dyn std::error::Error + 'static)>>` because of return type
27 | …Run Code Online (Sandbox Code Playgroud)