javascript - 如何在 Typescript 中使 Promise 类型安全?
问题描述
Promise 在 Typescript 中似乎是一种类型不安全的。这个简单的例子表明resolve
接受undefined
,而Promise.then
似乎推断参数是非undefined
:
function f() {
return new Promise<number>((resolve) => {
resolve(undefined)
})
}
f().then((value) => {
console.log(value+1)
})
(在我当前的项目中尝试过http://www.staging-typescript.org/play)。
显然,Typescript 推断的类型value
是number
,而不是number | PromiseLike<number> | undefined
。
这可能是当前的 Typescript 问题,但是...
什么是适当的解决方法?我希望编译器警告我value
可能未定义!
一个非常简单的解决方案可能是写
f().then((value:number | undefined) => {
console.log(value+1) // now I have: Object is possibly 'undefined'
})
但这需要我在每个呼叫站点积极思考问题。
编辑(当前状态):按照@JerMah 给出的解决方案,我将Promise
创建包装在一个通用函数中:
function makePromise<T>(executor: (resolve: (value: T) => void,
reject: (reason?: any) => void) => void)
{
return new Promise<T>(executor);
}
解决方案
您可以手动设置解析函数的签名。这样你就不能传递它未定义。
function f() {
return new Promise<number>((resolve: (arg0: number) => void) => {
resolve(undefined); // Argument of type 'undefined' is not assignable to parameter of type 'number'.
});
}
推荐阅读
- reactjs - 如何在 React Native 中使用 React Native Video 显示多个视频?
- python - 扫描字符串文字时出现语法错误'EOL (
,第 9 行)' - laravel - Laravel更新雄辩不更新记录
- spring - 没有可用于当前线程的具有实际事务的 EntityManager:多个配置 xml 文件
- java - 使用 powershell 创建防火墙规则
- r-exams - 添加跳过/未评分的开放式问题
- sql - 具有多个条件的 SQLite CASE 查询
- oracle - 合并查询以在 100 个用户之间分配相等数量的记录
- android - 我不知道如何在Android中对JSON数据进行分类
- php - Laravel - whereHas last 关系是 = 'manual'