我是Typescript的新手,但是一直在阅读文档(关于这个问题,特别是这个page)。
为帮助巩固我对打字稿的理解,我从小处开始,输入“ API”。假设此API的请求参数之一为format
。开发人员可能会获得这种格式的String
文字,但是API需要Integer
。在这种情况下,请求参数中的一个似乎是enum
(尽管在一般情况下,它可能是从String
到String
的映射,或其他):
// 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)
}
理想情况下,mapFormatNameToIndex
和mapFormatIndexToName
是否可以根据类型自动生成?
// 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);
}