DeepPartial:使用 null 而不是 undefined

DeepPartial: use null instead of undefined

utility-types 中的 DeepPartial 泛型类型应用到 Typescript 类型时,我注意到所有属性的类型都自动扩展为包括 undefined。 IE。以前的 T 类型的 属性 现在变成 T | undefined.

例如以下代码无法通过类型检查:

import { DeepPartial } from 'utility-types';

type A = { a1: number, a2: number};
type B = DeepPartial<A>;

const b: B = { a1: null };

打字稿游乐场是 here

我知道这也是普通老 Partial 所做的。但是,为什么选择 | undefined (在这两种情况下)而不是有更深层次的原因,例如至:| null| null | undefined 有没有一种方法可以自定义 DeepPartial 通用类型,以便生成 属性 类型 | null 而不是?

Partial<T>的目的是将{x: number, y: string}这样的类型转换成{x?: number, y?: string}这样的属性都是可选的类型。在这种情况下,属性的类型是 number | undefinedstring | undefined 因为 ? 意味着 属性 允许丢失,而 undefined 是你得到的访问丢失的 属性.

要获得 null 而不是 undefined,您只需取 source code for DeepPartial 并进行调整即可:

type DeepNullable<T> = T extends Function
    ? T
    : T extends Array<infer U>
    ? _DeepNullableArray<U>
    : T extends object
    ? _DeepNullableObject<T>
    : T | null;

interface _DeepNullableArray<T> extends Array<DeepNullable<T>> {}

type _DeepNullableObject<T> = { [P in keyof T]: DeepNullable<T[P]> | null };

演示:

type Foo = {
    foo: number,
    bar: {
        baz: Array<{ quz: string }>
        qux: boolean
    }
}

// test has no type errors
let test: DeepNullable<Foo> = {
    foo: null,
    bar: {
        baz: [{quz: null}, {quz: null}],
        qux: null
    }
}

Playground Link