打字稿删除可选 属性
typescript remove optional property
我正在尝试为构建器构建动态类型
export type Builder<T, K extends keyof T> = {
[P in K]: (value: T[P]) => Builder<T, K>;
} & {
build(): Readonly<T>;
};
如果我有一个 class 或一个带有可选属性的接口,我会得到这样的错误:
$ tsc
test/OtherClass.ts:29:1 - error TS2722: Cannot invoke an object which is possibly 'undefined'.
29 OtherClass.builder().patate(Patate.AU_FOUR).build();
~~~~~~~~~~~~~~~~~~~~~~~~~~~
这是我的class
export class OtherClass {
constructor(
public literal: string | undefined,
public patate?: Patate,
public hello: Readonly<Hello> = {},
) { }
static builder: () => Builder<OtherClass, keyof OtherClass> = builder.for(OtherClass);
}
我期望该类型为每个属性创建一个具有非可选方法的构建器,但出于某种原因,patate
的可选性似乎是键而不是类型所固有的。 属性 literal
没有这种行为
这对我来说似乎是个问题。我正在使用打字稿 3.1.4。还有另一种动态删除问号的方法吗?
我尝试使用 NonNullable
帮助程序首先创建我的类型的副本,其中没有任何内容可为空,但 patate
仍然是可选的。
这是vscode给我的有效类型
(property) patate?: ((value: Patate | undefined) => Builder<OtherClass, "literal" | "patate" | "hello">) | undefined
这有帮助吗?
export type Builder<T, K extends keyof T> = {
[P in K]-?: (value: T[P]) => Builder<T, K>;
} & {
build(): Readonly<T>;
};
请注意 -?
它可以满足您的需求 - 删除可选性。
我正在尝试为构建器构建动态类型
export type Builder<T, K extends keyof T> = {
[P in K]: (value: T[P]) => Builder<T, K>;
} & {
build(): Readonly<T>;
};
如果我有一个 class 或一个带有可选属性的接口,我会得到这样的错误:
$ tsc
test/OtherClass.ts:29:1 - error TS2722: Cannot invoke an object which is possibly 'undefined'.
29 OtherClass.builder().patate(Patate.AU_FOUR).build();
~~~~~~~~~~~~~~~~~~~~~~~~~~~
这是我的class
export class OtherClass {
constructor(
public literal: string | undefined,
public patate?: Patate,
public hello: Readonly<Hello> = {},
) { }
static builder: () => Builder<OtherClass, keyof OtherClass> = builder.for(OtherClass);
}
我期望该类型为每个属性创建一个具有非可选方法的构建器,但出于某种原因,patate
的可选性似乎是键而不是类型所固有的。 属性 literal
这对我来说似乎是个问题。我正在使用打字稿 3.1.4。还有另一种动态删除问号的方法吗?
我尝试使用 NonNullable
帮助程序首先创建我的类型的副本,其中没有任何内容可为空,但 patate
仍然是可选的。
这是vscode给我的有效类型
(property) patate?: ((value: Patate | undefined) => Builder<OtherClass, "literal" | "patate" | "hello">) | undefined
这有帮助吗?
export type Builder<T, K extends keyof T> = {
[P in K]-?: (value: T[P]) => Builder<T, K>;
} & {
build(): Readonly<T>;
};
请注意 -?
它可以满足您的需求 - 删除可选性。