Извлечение возвращаемых типов функций и фильтрация по имени свойства в машинописи - PullRequest
0 голосов
/ 19 декабря 2018

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

Для иллюстрации, скажем, у нас есть следующий объект функций:

export const StorageActions = {
  addFile: () => ({ type: 'ADD_FILE' }),
  deleteFile: () => {
    return () => {
      return null;
    };
  },
};
type StorageActionsTypes = typeof StorageActions;

С помощью ReturnType я могу увидеть, какая функция имеет возвращаемое имя свойства 'type':

enter image description here

Чтобы проверить функции, у которых есть возвращаемое имя свойства 'type', я делаю следующее:

type filteredActions = { [K in keyof StorageActionsTypes]: 
    keyof ReturnType<StorageActionsTypes[K]> extends ('type') ?  'valid' : 'invalid'};

но результат неожиданный:

enter image description here

должно быть:

interface filteredActions {
  addFile: 'valid';
  deleteFile: 'invalid';
}

Я неправильно использую «extends»?Каков наилучший способ достичь этого?

1 Ответ

0 голосов
/ 19 декабря 2018

Проблема в вашей интерпретации never.Никогда, как описано в PR :

never, является подтипом и присваивается каждому типу.

Это означает, что этот тип type y = never extends 's' ? 'Y' : 'N' будет 'Y', поскольку never является подтипом 's'.

Простое решение здесь не в том, чтобы использовать keyof (который для функций вернет never, следовательно, проблема выше)

export const StorageActions = {
    addFile: () => ({ type: 'ADD_FILE' }),
    deleteFile: () => {
        return () => {
            return null;
        };
    },
};

type StorageActionsTypes = typeof StorageActions
type filteredActions = {
    [K in keyof StorageActionsTypes]:
        ReturnType<StorageActionsTypes[K]> extends { type: any } ? 'valid' : 'invalid'
}; // now  { addFile: "valid"; deleteFile: "invalid"; }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...