为什么TypeScript不会为此承诺链抛出编译错误?

时间:2016-12-21 16:49:45

标签: javascript typescript promise

我还在学习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

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

1 个答案:

答案 0 :(得分:4)

那是因为在TS中,功能的类型&#39;论据是双变量的。

对于Promise.then,任何传递的函数都将被接受,前提是它的参数是所需类型的子类型或超类型。所以总是会接受一个对象(Object,{})。幸运的是,它仍会捕捉到广泛不兼容的类型;比期待{ x: string}但收到{ y: number },以便捕获大多数类型错误。

这是一个有利有弊的设计决策; (就个人而言,我认为这不值得)他们甚至可能在未来改变它,因为最后几个版本的TS显然采取了使TS越来越响的方向。