【问题标题】:typescript remove optional property打字稿删除可选属性
【发布时间】:2019-04-18 02:33:37
【问题描述】:

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

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

【问题讨论】:

    标签: typescript typescript3.0


    【解决方案1】:

    这有帮助吗?

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

    注意-?,它可以做你想做的事 - 删除可选性。

    【讨论】:

    • 是的,谢谢,但你知道为什么它继承了键名的可选性吗?
    • 当映射类型(in 之后的类型,确定属性集)的“约束”为keyof T 形式或者是受keyof T 约束的类型参数时某些类型T,映射类型是“同态”并从T 复制修饰符(可选和只读)。这个here有点意思。
    猜你喜欢
    • 2015-05-26
    • 2018-06-05
    • 1970-01-01
    • 2016-11-01
    • 2021-12-30
    • 1970-01-01
    • 1970-01-01
    • 2021-11-30
    • 2019-12-22
    相关资源
    最近更新 更多