Тип для команд делегата - PullRequest
0 голосов
/ 28 апреля 2020

У меня есть два типа моделей:

type ModelA = { type: 'ModelA' }
type ModelB = { type: 'ModelB' }
type Model = ModelA | ModelB

Теперь у меня есть функция делегата executeCommand:

function executeCommand(model: Model, command)

Допустимые команды для ModelA: read и update и действительными командами для ModelB являются add и delete.

Теперь я хочу создать обобщенный тип c для command, чтобы я мог ограничить command s, передаваемых executeCommand функция, основанная на типе model.

Я не хочу использовать интерфейсы или классы.

1 Ответ

0 голосов
/ 28 апреля 2020

https://stackblitz.com/edit/typing-functions?file=index.ts

type ModelA = { type: 'ModelA' }
type ModelB = { type: 'ModelB' }
type Model = ModelA | ModelB

type readCommand = (model: ModelA) => void;
type updateCommand = (model: ModelA) => void;

type addCommand = (model: ModelB) => void;
type deleteCommand = (model: ModelB) => void;


function executeCommand(model: ModelB, command: addCommand|deleteCommand): void;
function executeCommand(model: ModelA, command: readCommand|updateCommand): void;
function executeCommand<T=Model>(model: T, command: (model: T) => void): void {
  console.log(model, command);
  command(model);
}

const addCommandImplementation: addCommand = (model: ModelB) => {
  console.log('add command with',model);
}

const readCommandImplementation: readCommand = (model: ModelA) => {
  console.log('read command with',model);
}

const f: Model = {type: 'ModelA'};

executeCommand(f,addCommandImplementation);
executeCommand(f,readCommandImplementation);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...