更具体地说,有一种方法可以将参数someFilters
约束为一个对象,该对象是另一个对象filters
的子/部分,使得typof someFilters[key] = typeof filters[key]
(但不一定是反过来)?
Partial不会执行,因为它将所有字段都定义为可能未定义。在我试图定义通用功能时,Pick要求您事先知道键。我正在寻找一个泛型函数,或者一个只接受一个类型参数的类型泛型-我们所指的大对象的类型。
答案 0 :(得分:1)
您可以创建一个接受过滤器类型T
的函数,而扩展类型为Partial<T>
的对象。这表示为扩展Partial<T>
的额外类型参数。这意味着将保留传入的对象的实际类型,因此在创建对象之后,对象上没有undefined
可以包含的额外字段:
interface Filter {
searchText: string;
min: number;
max: number;
}
function createPartial<T>() {
return function <P extends Partial<T>>(o: P) {
return o
}
}
let subFilter = createPartial<Filter>()({
min: 1,
})
subFilter.min // ok
subFilter.max // err
注意:我们需要使用一个函数,因为打字稿不支持部分类型推断,因此必须返回一个函数。上面的函数适用于任何T
,但是您可以创建特定于某种类型的版本(即Filter
),从而消除使用此技巧的必要性。另外partial type inference可能很快就会击中Typescript。