在TypeScript 2.1.5中编译时没有错误:
function promiseANumber(): Promise<number> {
return new Promise(resolve => resolve('definitely not a number'));
}
我希望报告错误,因为根据类型定义,使用字符串而不是数字调用resolve函数。
为什么TypeScript编译器没有捕获并报告此类型不匹配?
再看一下,使用异步函数定义,编译器会正确报告类型不匹配。所以这个:
async function promiseANumber(): Promise<number> {
return 'definitely not a number';
}
给出
error TS2322: Type '"definitely not a number"' is not assignable to type 'number'.
为什么这些案例表现不同?
看起来让编译器正确捕获它的方法是明确告诉它你返回哪种类型的承诺。所以这就足够了:
function promiseANumber() {
return new Promise<number>(resolve => resolve('definitely not a number'));
}
编译器现在抱怨:
error TS2345: Argument of type '"definitely not a number"' is not assignable to parameter of type 'number | Thenable<number>'.
我想我现在的问题是,为什么编译器可以根据我在这个问题开头给出的定义来推断这个?
令人高兴的是,TypeScript 2.4现在表示我原始代码的错误!由于它现在支持return types as inference targets。该公告甚至有一个代码示例与我最初给出的示例非常相似。
答案 0 :(得分:3)
在这种情况下......
function promiseANumber(): Promise<number> {
return new Promise(resolve => resolve('definitely not a number'));
}
...解析不期望number
的原因是因为在撰写{}
时它被指定为new Promise(...)
,因为它是默认类型new Promise()
。然后编译器允许Promise<{}>
到Promise<number>
的赋值......本身就有问题。
在这种情况下......
async function promiseANumber(): Promise<number> {
// type returned is Promise<string>, doesn't match Promise<number>
return 'definitely not a number';
}
...返回的类型为Promise<string>
且与Promise<number>
不匹配,因此编译器会抛出错误。
在带有promise的示例中,您可以通过执行以下操作告诉编译器将promise定义为Promise<number>
:
function promiseANumber(): Promise<number> {
return new Promise<number>(resolve => resolve('definitely not a number'));
}
...这会导致编译错误,因为string
无法分配给number
。