这在TypeScript 2.1.5中编译时没有错误:
function promiseANumber(): Promise<number> {
return new Promise(resolve => resolve('definitely not a number'));
}
Run Code Online (Sandbox Code Playgroud)
我希望报告错误,因为根据类型定义,使用字符串而不是数字调用resolve函数.
为什么TypeScript的编译器没有捕获和报告此类型不匹配?
再看一下,使用异步函数定义,编译器会正确报告类型不匹配.所以这:
async function promiseANumber(): Promise<number> {
return 'definitely not a number';
}
Run Code Online (Sandbox Code Playgroud)
给
error TS2322: Type '"definitely not a number"' is not assignable to type 'number'.
Run Code Online (Sandbox Code Playgroud)
为什么这些案例表现不一样?
它看起来像是让编译器正确捕获它以明确告诉它返回哪种类型的promise的方法.所以这就足够了:
function promiseANumber() {
return new Promise<number>(resolve => resolve('definitely not a number'));
}
Run Code Online (Sandbox Code Playgroud)
编译器现在抱怨的:
error TS2345: Argument of type '"definitely not a number"' is not assignable to parameter of type 'number | Thenable<number>'.
Run Code Online (Sandbox Code Playgroud)
我想我现在的问题是,为什么编译器不能推断出这一点,考虑到我在这个问题的开头给出的定义?
令人高兴的是,TypeScript 2.4现在为我的原始代码指出了正确的错误!这是因为它现在支持返回类型作为推理目标.该公告甚至有一个代码示例与我最初给出的示例非常相似.
在这种情况下...
function promiseANumber(): Promise<number> {
return new Promise(resolve => resolve('definitely not a number'));
}
Run Code Online (Sandbox Code Playgroud)
...resolve 不期望的原因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';
}
Run Code Online (Sandbox Code Playgroud)
...返回的类型Promise<string>不匹配,Promise<number>因此编译器会抛出错误。
在带有承诺的示例中,您可以告诉编译器通过执行以下操作来定义承诺Promise<number>:
function promiseANumber(): Promise<number> {
return new Promise<number>(resolve => resolve('definitely not a number'));
}
Run Code Online (Sandbox Code Playgroud)
...这将导致编译错误,因为string不可分配给number.
| 归档时间: |
|
| 查看次数: |
607 次 |
| 最近记录: |