TypeScript:类型兼容性

时间:2019-04-30 04:46:39

标签: typescript

var A: { [key: string]: string }
var B: { foo: string } = { foo: 'hahah' }

A = B // ok

var C: (state: { [key: string]: string; }) => void
var D = (state: { foo: string }) => {}

C = D // throw error

因为A = B没问题,所以我认为{ foo: string }{ [key: string]: string }兼容

但是C = D会抛出一个错误,提示Types of parameters 'state' and 'state' are incompatible.Property 'foo' is missing in type '{ [key: string]: string; }' but required in type '{ foo: string; }'.

请告诉我为什么?

2 个答案:

答案 0 :(得分:1)

在开始之前,让我们修复C的返回类型-它应该是void(而不是{}),因为D不会返回任何内容。

现在,只有在启用--strictFunctionTypes编译器选项的情况下,才会出现此错误。

通过以下方式查看此内容:

函数C(在其参数类型声明中)指出它可以使用 any 键处理对象。
函数D-要求参数至少具有foo键。

var C: (state: { [key: string]: string; }) => void
var D = (state: { foo: string }) => {
    console.log(state.foo.toUpperCase())
}

C = D // error with strictFunctionTypes

C({}) // will blow up at runtime
  

描述该示例的另一种方式是,在默认类型检查模式下,(x: T) => void的类型T是双变量(即协变或逆变),而在严格函数类型中,T的类型却是{{模式。

更多信息here

答案 1 :(得分:0)

因为A = B并不意味着B = A。 :

var A: { [key: string]: string }
var B: { foo: string } = { foo: 'hahah' }

A = B // ok

var C: (state: { [key: string]: string; }) => {}
var D = (state: { foo: string }) => {}

C = D // throw error
// Because 
B = A // Error