gpt4 book ai didi

Typescript 条件类型和对象属性

转载 作者:行者123 更新时间:2023-12-05 07:22:27 25 4
gpt4 key购买 nike

是否可以在 TypeScript 中声明一个泛型类(或示例中的工厂函数),它接受一个影响类属性类型和相关函数的二进制条件类型变量?

例如:

export function CreateModel<T extends 'CREATE' | 'UPDATE'>(mode: T) {
type valueType = T extends 'CREATE' ? { name: string } : { name: string; email: string };
return {
value: {} as valueType,
onChange(change: Partial<valueType>) {
if (mode === 'UPDATE') {
this.value.email = change.email;
}
}
};
}

最佳答案

所以看起来您正在使用 T extends 'CREATE' | 扩展字符串“更新”,我不确定你能做到这一点。这基本上是在说“它可以是任何字符串或这两个特定的字符串”——这与说“任何字符串”本质上是一样的

如果你想说你只希望输入值是 'CREATE''UPDATE' 那么你只能允许这两个字符串CreateModel(模式:'CREATE' | 'UPDATE')

另一个问题是您正在使用 this 但您在一个函数内部,而不是一个类中,因此它的工作方式并不完全相同,无论如何您可能会遇到一些问题。通常不鼓励这样做,您应该使用类。

这是我想出的,and it compiles .我知道它有点“绕过”你最初的问题是什么,但我相信那也是因为你没有在这里使用类(class)

type ICreateType = { name: string };
type IUpdateType = { name: string; email: string | undefined };
interface IReturnCreateValue {
value: ICreateType,
};
interface IReturnUpdateValue {
value: IUpdateType,
onChange: (change: Partial<IUpdateType>) => void;
};

export function CreateModel(mode: 'CREATE' | 'UPDATE'): IReturnCreateValue | IReturnUpdateValue {
if (mode === 'CREATE') {
return { value: { name: '' } };
}

let value: IUpdateType = { name: '', email: '' };
return {
value: value,
onChange(change: Partial<IUpdateType>) {
value.email = change.email;
}
};
};

CreateModel('CREATE');
CreateModel('UPDATE');
CreateModel('foo'); //compile error

这是一个关于它如何作为一个类工作的想法(也是 on typescript playground )

type IValueType = { name: string; email?: string };
interface IValue {
value: IValueType,
onChange?: (change: Partial<IValueType>) => void;
};

class CreateModel {
value: IValueType = { name: '' };
onChange: undefined | ((c: Partial<IValueType>) => void) = undefined;

constructor(private readonly shouldUpdate: boolean) {
if (this.shouldUpdate) {
this.onChange = (change: Partial<IValueType>) {
this.value.email = change.email;
}
}
}
}

const a = new CreateModel(false);
const b = new CreateModel(true);

关于Typescript 条件类型和对象属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56483296/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com