Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Typescript 缩小回调参数的类型_Typescript - Fatal编程技术网

Typescript 缩小回调参数的类型

Typescript 缩小回调参数的类型,typescript,Typescript,我有一个功能: type Callback=(数据:记录)=>void const execCb=(cb:Callback)=>{ cb(某些数据) } 如您所见,数据非常通用,因为它可以是任何对象。但是,在定义回调时,我希望将数据缩小到特定类型: 类型MyCallBackData={ 傅:字符串, 酒吧:号码 } 常量myCallback=(数据:MyCallBackData)=>{ //做点什么 } execb(myCallback) Typescript抱怨,类型“Record”缺少类

我有一个功能:

type Callback=(数据:记录)=>void
const execCb=(cb:Callback)=>{
cb(某些数据)
}
如您所见,数据非常通用,因为它可以是任何对象。但是,在定义回调时,我希望将数据缩小到特定类型:

类型MyCallBackData={
傅:字符串,
酒吧:号码
}
常量myCallback=(数据:MyCallBackData)=>{
//做点什么
}
execb(myCallback)
Typescript抱怨,
类型“Record”缺少类型“MyCallBackData”中的以下属性:foo,bar

在这种情况下,如何正确缩小类型


praground:

参数
Record
,意味着可以传入一个没有属性的对象(就像传入
{}
),但是传入的回调需要在第一个参数上有proeprities。所以这不是类型安全的

您可以做的是使
execCb
generic,以便参数可以是任何类型。这也意味着您将无法在
execCb
中传入具体对象(至少在没有类型断言的情况下是这样)。例如,您可以将其作为额外参数传递给
execCb

type Callback<T> = (data: T) => void

const execCb = <T extends Record<string, unknown>>(cb: Callback<T>, param: T) => {
  cb(param)
}

type MyCallBackData = {
  foo: string,
  bar: number
}

const myCallback = (data: MyCallBackData) => {
  // do something
}

execCb(myCallback, {
  foo: "",
  bar: 1
})
type Callback=(数据:T)=>void
const execCb=(cb:Callback,param:T)=>{
cb(参数)
}
类型MyCallBackData={
傅:字符串,
酒吧:号码
}
常量myCallback=(数据:MyCallBackData)=>{
//做点什么
}
execb(myCallback{
傅:“,
酒吧:1
})

关于传递给回调的对象bering,我知道它始终是一条记录。我还可以通过编程确保为每个回调定义了所需的属性。然而,我不知道如何告诉typescript“我知道这个参数是正确的,并且拥有这个回调所需要的一切”。