我还在学习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示例中onfulfilled
的{{1}}函数会收到.then
?
答案 0 :(得分:4)
那是因为在TS中,功能的类型&#39;论据是双变量的。
对于Promise.then,任何传递的函数都将被接受,前提是它的参数是所需类型的子类型或超类型。所以总是会接受一个对象(Object,{})。幸运的是,它仍会捕捉到广泛不兼容的类型;比期待{ x: string}
但收到{ y: number }
,以便捕获大多数类型错误。
这是一个有利有弊的设计决策; (就个人而言,我认为这不值得)他们甚至可能在未来改变它,因为最后几个版本的TS显然采取了使TS越来越响的方向。