Как сделать эту функцию отображения машинописи намного менее сложной? - PullRequest
0 голосов
/ 17 октября 2018

Я пытаюсь сделать довольно простую карту между некоторыми известными значениями и некоторыми другими известными значениями.Все в этом коде кричит, я упускаю что-то простое, что может сделать машинопись.

type PortInfoProp = 'comName' | 'manufacturer' | 'serialNumber' | 'vendorId' | 'productId' | 'pnpId'

interface LinuxPort extends PortInfo {}

interface PropNames {
  readonly DEVLINKS: PortInfoProp
  readonly DEVNAME: PortInfoProp
  readonly ID_MODEL_ID: PortInfoProp
  readonly ID_SERIAL_SHORT: PortInfoProp
  readonly ID_VENDOR_ENC: PortInfoProp
  readonly ID_VENDOR_ID: PortInfoProp
}

type PropName = keyof PropNames

function propName(name: PropName): PortInfoProp | null {
  const map: PropNames = {
    DEVNAME: 'comName',
    ID_VENDOR_ENC: 'manufacturer',
    ID_SERIAL_SHORT: 'serialNumber',
    ID_VENDOR_ID: 'vendorId',
    ID_MODEL_ID: 'productId',
    DEVLINKS: 'pnpId',
  }
  return map[name] || null
}

Ответы [ 2 ]

0 голосов
/ 17 октября 2018

Оператор switch был немного более кратким.

type PortInfoProp = 'comName' | 'manufacturer' | 'serialNumber' | 'vendorId' | 'productId' | 'pnpId'
type PropName = 'DEVLINKS' | 'DEVNAME' | 'ID_MODEL_ID' | 'ID_SERIAL_SHORT' | 'ID_VENDOR_ENC' | 'ID_VENDOR_ID'

function propName(name: PropName): PortInfoProp | null {
  switch (name) {
    case 'DEVNAME':
      return 'comName'
    case 'ID_VENDOR_ENC':
      return 'manufacturer'
    case 'ID_SERIAL_SHORT':
      return 'serialNumber'
    case 'ID_VENDOR_ID':
      return 'vendorId'
    case 'ID_MODEL_ID':
      return 'productId'
    case 'DEVLINKS':
      return 'pnpId'
    default:
      return null
  }
}
0 голосов
/ 17 октября 2018

Первое, что я сделал бы, это переместил бы вашу карту за пределы функции;нет необходимости воссоздавать его при каждом вызове.Затем вы можете объявить свое отображение как словарь:

type PropName = 'DEVNAME' | 'ID_VENDOR_ENC' | 'ID_SERIAL_SHORT' | 'ID_VENDOR_ID' | 'ID_MODEL_ID' | 'DEVLINKS';
type PortInfoProp = 'comName' | 'manufacturer' | 'serialNumber' | 'vendorId' | 'productId' | 'pnpId';

type PropertyMapping = { [key in PropName]: PortInfoProp };

const map: PropertyMapping = {
  DEVNAME: 'comName',
  ID_VENDOR_ENC: 'manufacturer',
  ID_SERIAL_SHORT: 'serialNumber',
  ID_VENDOR_ID: 'vendorId',
  ID_MODEL_ID: 'productId',
  DEVLINKS: 'pnpId',
}

function propName(name: PropName): PortInfoProp | null {
  return map[name] || null
}

Редактировать :

Более кратко, если вам не нужны именованные типы для ключей карты /значения:

const map = {
  DEVNAME: 'comName',
  ID_VENDOR_ENC: 'manufacturer',
  ID_SERIAL_SHORT: 'serialNumber',
  ID_VENDOR_ID: 'vendorId',
  ID_MODEL_ID: 'productId',
  DEVLINKS: 'pnpId',
}

type PropMapping = typeof map;

function propName<K extends keyof PropMapping>(name: K): PropMapping[K] | null {
  return map[name] || null
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...