繁体   English   中英

打字稿删除可选属性

typescript remove optional property

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我正在尝试为构建器构建动态类型

export type Builder<T, K extends keyof T> = {
    [P in K]: (value: T[P]) => Builder<T, K>;
} & {
    build(): Readonly<T>;
};

如果我有一个带有可选属性的类或接口,则会出现这种错误:

$ tsc
test/OtherClass.ts:29:1 - error TS2722: Cannot invoke an object which is possibly 'undefined'.

29 OtherClass.builder().patate(Patate.AU_FOUR).build();
   ~~~~~~~~~~~~~~~~~~~~~~~~~~~

这是我的课

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
1 个回复

这有帮助吗?

export type Builder<T, K extends keyof T> = {
    [P in K]-?: (value: T[P]) => Builder<T, K>;
} & {
    build(): Readonly<T>;
};

注意-? 可以满足您的需求-消除了可选性。

3 在 TypeScript 中将单个属性设为可选

在 TypeScript 中,2.2... 假设我有一个 Person 类型: 我想创建一个返回一个人的函数,但不需要昵称: input的类型应该是什么? 我正在寻找一种动态方式来指定与Person相同的类型,除了nickname是可选的( nickname?: string | und ...

5 使用可选属性扩展 TypeScript 类型

我正在使用 NextJS,需要使用我自己添加的可选参数来扩展他们的AppProps类型Layout 。 然而AppProps类型由许多其他类型组成,例如 应用道具: 应用道具类型: 下一个组件类型: 从我的_app.tsx我希望能够将Layout添加到Component ,例如: 有 ...

9 打字稿界面可选方法属性未定义

我正在深度学习Typescript的Pluralsites课程。 使用接口时,我有以下几点: 我现在宣布一本书为: 一切都很好,但是一旦我将markDamaged的接口更改为可选接口,如下所示: 编译器在此行吠叫: 并说markDamaged属性可能未定义。 ...

10 打字稿不能根据可选属性缩小联合

我在缩小打字稿中的联合类型时遇到问题。 假设我们有两个接口和一个联合: interface A { flag: true callback: (arg: string) =&gt; void } interface B { flag?: false callbac ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2021 STACKOOM.COM