函数类型优先于打字稿中的参数类型吗?

时间:2020-03-08 10:55:17

标签: typescript

我正在尝试输入redux动作创建者:

const DO_SOMETHING = 'DO_SOMETHING'

interface DoSomethingAction extends Action<typeof DO_SOMETHING> {
  payload: number
}

const doSomething: ActionCreator<DoSomethingAction> = (n: number) => ({
  type: DO_SOMETHING,
  payload: n,
})

我曾期望用doSomething('why')调用此操作会失败,但是不会。

据我了解,这是因为redux类型具有:

interface ActionCreator<A> {
  (...args: any[]): A
}

为什么any在这里优先于(或扩大?)参数列表中的number类型?

(请参阅:typescript playground

1 个答案:

答案 0 :(得分:1)

类型注释始终优先于可以从用于分配变量或const的表达式中推断出的类型。如果您编写注释,则对表达式进行类型检查;如果您未编写类型注释,则使用表达式来推断变量或const的类型。

函数类型在这方面并不特殊;考虑这种情况:

const foo: any = "hello";

function bar(x: number): void {}

bar(foo);

由于类型注释,foo的类型为any,由于初始化程序的原因,string的类型为bar。因此foo可与any一起调用,因为number可分配给doSomething。同样,在您的代码中,...args: any[]的类型由于其类型注释而将number作为其参数,而不是any作为其创建函数的表达式。

此示例与您的示例一样不正确,因为any类型在设计上不合理。如果希望编译器检查代码的类型安全性,则不应直接或间接使用public class Templates { [PrimaryKey, AutoIncrement] public int Id { get; set; } public int Category { get; set; } [TextBlob("imagesBlobbed")] public List<int> Images { get; set; } public string imagesBlobbed { get; set; } }