你的例子可以简化为:
declare var signin: (data: { email: string, password: string }) => void
declare var record: (data: Record<string, unknown>) => void
signin = record
record = signin // error
如果您检查参数的可分配性,这会更有趣。您将看到可分配性被颠倒了。
declare var signinArg: { email: string, password: string }
declare var recordArg: Record<string, unknown>
signinArg = recordArg // error
recordArg = signinArg
Why signin
不可分配给record
but signinArg
可分配给recordArg
.
答案是:
打字稿中的函数与其参数是逆变的。这是设计使然。
您可以找到有关 TypeScript 中协方差的更多信息here https://stackoverflow.com/questions/66410115/difference-between-variance-covaraince-contravariance-and-bivariance-in-typesc
尝试禁用strictFunctionTypes
编译器标志。您会看到错误消失了。
以前,所有函数都是双变的,而且不安全。
Here https://stackoverflow.com/questions/68681526/why-cant-a-generic-member-function-in-a-class-implementing-an-interface-take-an/68682276#68682276您可以找到非常相似的问题以及更多问题背景