我想创建一个代表双字符ISO国家/地区代码的类型。有没有一种简单的方法为这些(或任何其他固定长度的项目)创建一个类型定义?
当然,一种方法是带有所有可能列表的枚举
type CountryCode = "AX" | "AL" | "DZ" | ...
但我喜欢更简单的东西,只强制使用2个字符的字符串。
我需要使用dynamic type tests吗?
答案 0 :(得分:4)
不,Flow没有这样的功能。它实际上没有任何依赖类型特征,其他可能是包含单个值的类型。
您可以像在JS中通常那样使用像if (countryCode.length === 2) { ... }
这样的测试,但Flow不会优化countryCode
块中if
的类型,因为没有Flow类型到表示两个字符的字符串。
相反,对于像if (countryCode !== null)
这样的实际动态类型测试,Flow会知道if countryCode
在if块中不为null,并且可以使用该知识进行类型检查。< / p>
请注意,从技术上讲,您可以生成一个类型,其中包含从A到Z的26 * 26 = 676个大写字符串:“AA”,“AB”,...,“ZY”,“ZZ”,但这不是改进你的实施。
答案 1 :(得分:0)
Tuples是固定长度的,因此您可以将国家/地区代码表示为两个数字的元组(每个字符一个)。
type CC = [number, number];
function fromString(str: string): CC {
if (str.length !== 2) {
throw new Error("not a cc: " + str);
}
return [
str.charCodeAt(0),
str.charCodeAt(1),
];
}
function toString(cc: CC): string {
return String.fromCharCode(cc[0]) + String.fromCharCode(cc[1]);
}