[英]Typescript Conditional Types and Object Properties
是否可以在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' | 'UPDATE'
字符串T extends 'CREATE' | 'UPDATE'
T extends 'CREATE' | 'UPDATE'
,我不確定您能做到。 基本上是說“可以是任何字符串或這兩個特定的字符串”-基本上與說“任何字符串”相同
如果要說只希望輸入值是'CREATE'
或'UPDATE'
那么只能通過執行CreateModel(mode: 'CREATE' | 'UPDATE')
允許這兩個字符串。
另一個問題是您正在使用this
函數,但您位於函數內部,而不是類內部,因此它的工作方式並不完全相同,並且可能會遇到一些問題。 通常不建議這樣做,您應該使用一個類。
這是我想出的, 它可以編譯 。 我知道這“繞開”了您最初的問題的初衷,但是我相信那也是因為您在這里沒有使用課程
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
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);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.