gpt4 book ai didi

javascript - 为什么 TypeScript 不会为此 promise 链抛出编译错误?

转载 作者:行者123 更新时间:2023-11-30 09:40:43 28 4
gpt4 key购买 nike

我仍在学习 Typescript,所以也许我只是从根本上遗漏了一些东西,但我不明白为什么以下代码会引发编译错误:

// An example without Promises (does not compile)
function getAnObject(): Object {
return { value: 'Hello' };
};

function doSomethingWithAString(input: String) {
console.log(input);
}

const result = getAnObject();
// error TS2345: Argument of type 'Object' is not assignable to parameter of type 'String'
doSomethingWithAString(result);

但是下面的代码没有:

// A similar example with Promises (compiles)
function getAnObjectAsync(): Promise<Object> {
return Promise.resolve({ value: 'Hello' });
};

getAnObjectAsync().then(function (result: String) {
// Throws a runtime exception
console.log(result.toUpperCase());
});

为什么 TypeScript 不会提示 Promise 示例中 .thenonfulfilled 函数会收到 result: Object

  • 我做错了什么吗?
  • 这个例子有什么我不明白的地方吗?

最佳答案

那是因为在 TS 中,函数参数的类型是双变的。

在 Promise.then 的情况下,任何传递的函数都将被接受,只要它的参数是所需类型的子类型或父类(super class)型。所以一个对象 (Object, {}) 总是会被接受。幸运的是,它当然仍然会捕获广泛不兼容的类型;就像期待一个 { x: string} 但收到一个 { y: number } 所以它捕获大多数类型错误。

这是一个有利有弊的设计决策; (我个人认为不值得)他们甚至可能会在未来更改它,因为最近几个版本的 TS 明确地朝着使 TS 越来越完善的方向发展。

关于javascript - 为什么 TypeScript 不会为此 promise 链抛出编译错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41267897/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com