如何在 Typescript 中使 Promise 类型安全?
How do I make a Promise typesafe in Typescript?
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'
})
但这需要我在每个调用点都积极思考问题。
编辑(当前状态):在 之后,我将 Promise
创建包装在一个通用函数中:
function makePromise<T>(executor: (resolve: (value: T) => void,
reject: (reason?: any) => void) => void)
{
return new Promise<T>(executor);
}
不幸的是,当前的 TypeScript 无法做到这一点。但是,以稍微冗长为代价,您可以将代码更改为如下所示:
const iReturnUndefined = () => undefined
function f() {
return new Promise<number>((resolve) => {
const resolvedVal: number = iReturnUndefined() // Type 'undefined' is not assignable to type 'number'.
resolve(resolvedVal)
})
}
您可以手动设置解析函数的签名。这样你就不能传递它 undefined.
function f() {
return new Promise<number>((resolve: (arg0: number) => void) => {
resolve(undefined); // Argument of type 'undefined' is not assignable to parameter of type 'number'.
});
}
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'
})
但这需要我在每个调用点都积极思考问题。
编辑(当前状态):在 Promise
创建包装在一个通用函数中:
function makePromise<T>(executor: (resolve: (value: T) => void,
reject: (reason?: any) => void) => void)
{
return new Promise<T>(executor);
}
不幸的是,当前的 TypeScript 无法做到这一点。但是,以稍微冗长为代价,您可以将代码更改为如下所示:
const iReturnUndefined = () => undefined
function f() {
return new Promise<number>((resolve) => {
const resolvedVal: number = iReturnUndefined() // Type 'undefined' is not assignable to type 'number'.
resolve(resolvedVal)
})
}
您可以手动设置解析函数的签名。这样你就不能传递它 undefined.
function f() {
return new Promise<number>((resolve: (arg0: number) => void) => {
resolve(undefined); // Argument of type 'undefined' is not assignable to parameter of type 'number'.
});
}