如果声明参数类型,则TypeScript函数实现会将参数类型降级为“any”

如果声明参数类型,则TypeScript函数实现会将参数类型降级为“any”,typescript,Typescript,我有这样一个功能界面: interface Callback { (a: string, b: number): void; } const callback: Callback = (a, b) => { } 我可以实现它,而无需声明如下参数类型: interface Callback { (a: string, b: number): void; } const callback: Callback = (a, b) => { } 在本例中,TypeScript理

我有这样一个功能界面:

interface Callback {
  (a: string, b: number): void;
}
const callback: Callback = (a, b) => { }
我可以实现它,而无需声明如下参数类型:

interface Callback {
  (a: string, b: number): void;
}
const callback: Callback = (a, b) => { }
在本例中,TypeScript理解
回调的参数类型实际上是
(a:string,b:number)

但是,如果我声明它时键入了一个参数,例如
b:number

const callback: Callback = (a, b: number) => { }
另一个参数
a
的类型变为
any
。奇怪的是,编译器确实知道
a
应该是什么类型,因为它不会让您错误地定义它,例如
(a:boolean,b:number)
会说参数不兼容。为什么它不能推断
a
的参数类型


上面是一个简单的示例,但在尝试生成类型安全时,它让我有些头疼:

接口IReducer{
(状态:t状态,动作:IAction):t状态;
}
接口IReducerMap{
[actionType:string]:IReducer;
}
接口MyState{hello:string;}
接口MyAction扩展IAAction{say:string;}
常量myReducerMap:IReducerMap={
//结果:`(状态:MyState,操作:IAction)=>MyState`
//但是我在'action.say'上得到一个错误,没有在'IAction'中定义`
减速机1:(状态、动作)=>{
返回{hello:action.say};
},
//结果:`(状态:any,操作:MyAction)=>computed`
reducer2:(状态,操作:MyAction)=>{
返回{hello:action.say+state.this_应该是一个错误};
},
//有效,但依赖于您正确定义状态
reducer3:(状态:MyState,操作:MyAction)=>{
返回{hello:action.say};
}
}

由于每个函数将使用
IAction
的子类型作为其
action
参数(在本例中为
MyAction
),因此我必须在回调参数中声明其类型。但是一旦我声明了它的类型,我就丢失了
state
的类型,我必须声明它。当我有几十个回调,并且每个回调都有一个真实的状态名,比如
DataImportMappingState
,这很烦人。

a
b
的推断来自上下文键入。以前,只有当所有参数都未注释时,参数才是上下文类型的


因为它似乎不直观。现在,上下文类型将应用于所有没有显式类型注释的参数。

AFAIK,从值推断出的类型可以扩展声明的类型,尽管这非常违反直觉(因此可能我遗漏了一些东西)。我发誓你是机器人。再次感谢Ryan,我会在9分钟内接受,如果允许的话。:)