Параметр функции TypeScript с использованием перечисления с strictFunctionTypes - PullRequest
0 голосов
/ 28 июня 2018

Так что в настоящее время мы используем все строгие параметры в TypeScript 2.9, это позволило нам найти несколько проблем в нашей кодовой базе. Но теперь я столкнулся с интересной проблемой с использованием библиотеки JS, для которой требуется уникальный тип объекта.

Структура довольно проста. У нас есть объект, ключи которого являются строками, значения - это функции, которые принимают один объект, для которого определено свойство типа, совпадающее с ключом объекта, так как нам нравятся перечисления, попробовал это:

const enum Actions {
    Resume = 'resume',
    Stop = 'stop'
}

type action = (data: { type: Actions }) => Promise<any>;

//Types of property 'type' are incompatible. Type Actions is not assignable to type Actions.Resume
export const actions: { [key in Actions]: action} = {
    [Actions.Resume]: (data: { type: Actions.Resume }) => {
        return Promise.resolve();
    },
    [Actions.Stop]: (data: { type: Actions.Stop }) => {
        return Promise.resolve();
    }
}

Однако, поскольку мы используем строгие параметры, у TypeScript есть проблема с функциями их аргументом типа (см. детская площадка ). Причина, по которой мы хотим ввести объект вручную, состоит в том, чтобы убедиться, что все параметры перечисления присутствуют в объекте действий (см. Часть {[key in Actions]...}). Но это означает, что мы также должны набирать функции, иначе мы теряем функции их типа.

Мне интересно, возможно ли это даже с помощью проверки strictFunctionTypes или существует другое решение этой проблемы.

1 Ответ

0 голосов
/ 28 июня 2018

Я не уверен насчет этой ошибки, но вы можете попробовать это:

type Action<T> = (data: { type: T }) => Promise<any>;

export const actions: { [P in Actions]: Action<P> } = {
    [Actions.Resume]: (data: { type: Actions.Resume }) => {
        return Promise.resolve();
    },
    [Actions.Stop]: (data: { type: Actions.Stop }) => {
        return Promise.resolve();
    }
}

Это также предотвратит несоответствие между вашими actions ключами объекта и data.type, который должен принять обратный вызов, что, я думаю, вам и нужно:

export const actions: { [P in Actions]: Action<P> } = {
    [Actions.Resume]: (data: { type: Actions.Stop }) => {
        return Promise.resolve();
    }
}

Type '{type: Actions.Resume; } 'нельзя назначить типу' {type: Actions.Stop; } '

Фактически, тип обратного вызова data теперь должен быть набран контекстно:

export const actions: { [P in Actions]: Action<P> } = {
    [Actions.Stop]: data => {
        data.type // Actions.Stop
        return Promise.resolve();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...