DeepPartial:使用 null 而不是 undefined

Posted

技术标签:

【中文标题】DeepPartial:使用 null 而不是 undefined【英文标题】:DeepPartial: use null instead of undefined 【发布时间】:2020-11-19 03:12:25 【问题描述】:

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 ;

Typescript Playground 是 here。

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

【问题讨论】:

【参考方案1】:

Partial&lt;T&gt; 的目的是将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

【讨论】:

以上是关于DeepPartial:使用 null 而不是 undefined的主要内容,如果未能解决你的问题,请参考以下文章

位类型:默认为 '0' 而不是 NULL

标准使用“Z”而不是 NULL 来表示缺失数据?

为啥使用 null 函数而不是 == [] 来检查 Haskell 中的空列表?

我可以使用 if (pointer) 而不是 if (pointer != NULL) 吗?

如何在 SQL Server 中使用 XML 节点传递 NULL 而不是字符串格式的“NULL”值

Pyspark:使用 map 函数而不是 collect 来迭代 RDD