Javascript 如何使这个typescript映射函数不那么复杂?

Javascript 如何使这个typescript映射函数不那么复杂?,javascript,typescript,types,node-serialport,Javascript,Typescript,Types,Node Serialport,我试图在一些已知值和一些其他已知值之间做一个非常简单的映射。这段代码的所有内容都让我大吃一惊,我缺少了typescript可以做的一些简单的事情 type PortInfoProp = 'comName' | 'manufacturer' | 'serialNumber' | 'vendorId' | 'productId' | 'pnpId' interface LinuxPort extends PortInfo {} interface PropNames { readonly D

我试图在一些已知值和一些其他已知值之间做一个非常简单的映射。这段代码的所有内容都让我大吃一惊,我缺少了typescript可以做的一些简单的事情

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
}

我要做的第一件事是将地图移到函数之外;没有必要在每次通话时重新创建它。然后,可以将映射声明为字典:

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
}
常量映射={
DEVNAME:'comName',
ID\u供应商\u附件:“制造商”,
ID_SERIAL_SHORT:“serialNumber”,
ID\u供应商\u ID:“供应商ID”,
ID\u MODEL\u ID:'productId',
开发链接:“pnpId”,
}
类型PropMapping=类型映射;
函数propName(名称:K):PropMapping[K]| null{
返回映射[名称]| | null
}

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
  }
}

当然,与第二个变量一样,给定
map
,可以定义命名类型
type-PropName=keyof-PropMapping
type-portinfo-prop=PropMapping[PropName]
{DEVNAME:lit('comName'),ID_VENDOR_ENC:lit('manufacturer')…}