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; }'.
请告诉我为什么?
答案 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