簡體   English   中英

打字稿條件類型和對象屬性

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM