缩小回调类型参数



我有一个函数:

type Callback = (data: Record<string, unknown>) => void
const execCb = (cb: Callback) => {
cb(somedata)
}

可以看到,数据是非常通用的,因为它可以是任何对象。但是,当我定义回调时,我希望将数据缩小到特定类型:

type MyCallBackData = {
foo: string,
bar: number
}
const myCallback = (data: MyCallBackData) => {
// do something
}
execCb(myCallback)

Typescript抱怨,Type 'Record<string, unknown>' is missing the following properties from type 'MyCallBackData': foo, bar

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

Plaground:链接

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

您可以做的是使execCb泛型,因此参数可以是任何类型。这也意味着你不能在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
})

操场上联系

最新更新