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 | 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
}
}
将 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 | 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
}
}