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<T>
的目的是将x: number, y: string
之类的类型转换为属性都是可选的类型,例如x?: number, y?: string
。在这种情况下,属性的类型是number | undefined
和string | 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的主要内容,如果未能解决你的问题,请参考以下文章
为啥使用 null 函数而不是 == [] 来检查 Haskell 中的空列表?
我可以使用 if (pointer) 而不是 if (pointer != NULL) 吗?