在Typescript中,有没有一种方法可以将一个对象限制为另一个对象的子对象,而无需将所有字段都输入为undefined?

时间:2019-01-30 16:20:50

标签: typescript

更具体地说,有一种方法可以将参数someFilters约束为一个对象,该对象是另一个对象filters的子/部分,使得typof someFilters[key] = typeof filters[key](但不一定是反过来)?

Partial不会执行,因为它将所有字段都定义为可能未定义。在我试图定义通用功能时,Pick要求您事先知道键。我正在寻找一个泛型函数,或者一个只接受一个类型参数的类型泛型-我们所指的大对象的类型。

1 个答案:

答案 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。