Typescript:从自定义类型进行映射?

时间:2019-04-25 12:15:57

标签: typescript

我是Typescript的新手,但是一直在阅读文档(关于这个问题,特别是这个page)。

为帮助巩固我对打字稿的理解,我从小处开始,输入“ API”。假设此API的请求参数之一为format。开发人员可能会获得这种格式的String文字,但是API需要Integer。在这种情况下,请求参数中的一个似乎是enum(尽管在一般情况下,它可能是从StringString的映射,或其他):

// this case can be done via enum
enum Format = {JSON = 1, CSV = 2, XML = 3}

这对于有限的,已知的,最好是少量的选项当然是合适的。我的问题是,在打字稿中应该如何概括以下内容:

// code might use helper types ?
type FormatName = 'JSON' | 'CSV' | 'XML'
type FormatIndex = 1|2|3

// code might use "maps" for quick convert / validation
const mapFormatNameToIndex = {
  JSON: 1,
  CSV:  2,
  XML:  3
}

const mapFormatIndexToName = {
  1: 'JSON',
  2: 'CSV',
  3: 'XML'
}

// might validate for error handling via something like this
const isValidFormatName = (maybeIsFormatName: String | FormatName): Boolean | null => {
  const validFormatNames = Set(Object.keys(mapFormatNameToIndex))
  return validFormatNames.has(maybeIsFormatName)
}

理想情况下,mapFormatNameToIndexmapFormatIndexToName是否可以根据类型自动生成?

// this is pseudocode for what I would like
const mapFormatNameToIndex = {
  [key: FormatName]: FormatIndex
}
const mapFormatIndexToName = {
  [key: FormatIndex]: FormatName
}

// assumes that the hand defined options for the types are enumerable
for (let i = 0; i < FormatName.length; ) {
  mapped[FormatIndex[i]] = FormatName[i]]
}

请随时向我指出其他阅读资源/更好的语法/约定。

例如也许类型卫士更合适?

function isFormatName(maybeIsFormatName: String | FormatName): maybeIsFormatName is FormatName {
    // idk if this works
    return (<FormatName>maybeIsFormatName);
}

0 个答案:

没有答案