Javascript 如何使这个typescript映射函数不那么复杂?
我试图在一些已知值和一些其他已知值之间做一个非常简单的映射。这段代码的所有内容都让我大吃一惊,我缺少了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
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')…}
。