簡體   English   中英

來自枚舉的條件打字稿函數類型

[英]Conditional Typescript function typings from enum

我正在創建一個數據庫模式,它需要每個模型類型的字符串名稱,我需要避免使用類。 我的數據庫模型由枚舉和接口定義:

const enum Models {
  Person = 'Person',
  Vehicle = 'Vehicle',
}

export interface Person {
  firstname: string;
  lastname?: string;
}

export interface Vehicle {
  model: string;
  year?: string;
}

DatabaseModel 接口鏈接模型類型名稱和關聯數據:

export interface DatabaseModel {
  modelType: any;
  data: any;
}

此類型將接口映射到特定的枚舉。 我不確定如何准確地使用它,但我認為類型檢查需要它才能正常工作。

export type ModelInterfaceMap = {
  Person: Person;
  Vehicle: Vehicle;
}

我創建了一個創建 DatabaseModel 的函數,如下所示:

export function create(modelType: Models, data ): DatabaseModel {
  return {
    modelType,
    data,
  };
}

我的問題是,如何向上面的代碼添加類型,以便我可以調用 create 函數,並且只在第一個 modelType 參數中引用模型類型一次,並且仍然獲得根據關聯模型檢查數據的所有好處?

這應該通過類型檢查

var newPerson = create(Models.Person, { firstname: 'John', lastname: 'Doe' });
var newVehicle = create(Models.Vehicle, { model: 'Ford', year: '2018' });

這應該會失敗類型檢查,因為 Person 接口沒有年份

var newPersonFail = create(Models.Person, { firstname: 'John', lastname: 'Doe', year: '2018' });

我嘗試使用這樣的泛型類型,但這需要兩次編寫模型類型; 一次在泛型類型中,一次在傳入模型類型時。 我想避免必須兩次指定 modelType。

export function create<T>(modelType: Models, data : <T> ): DatabaseModel<T> {...}

您需要在泛型類型參數(作為枚舉文字類型)中捕獲傳遞給函數的實際枚舉成員。 有了這種類型,我們可以使用它來索引ModelInterfaceMap以根據傳入的枚舉獲取data的適當類型:

export function create<T extends Models>(modelType: T, data: ModelInterfaceMap[T]): DatabaseModel {
    return {
        modelType,
        data,
    };
}

var newPerson = create(Models.Person, { firstname: 'John', lastname: 'Doe' });
var newVehicle = create(Models.Vehicle, { model: 'Ford', year: '2018' });

var newPersonFail = create(Models.Person, { firstname: 'John', lastname: 'Doe', year: '2018' });

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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