我正在尝试输入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)
答案 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; }
}
。