如何在流中创建固定长度类型

时间:2016-08-30 20:05:32

标签: flowtype

我想创建一个代表双字符ISO国家/地区代码的类型。有没有一种简单的方法为这些(或任何其他固定长度的项目)创建一个类型定义?

当然,一种方法是带有所有可能列表的枚举

type CountryCode = "AX" | "AL" | "DZ" | ...

但我喜欢更简单的东西,只强制使用2个字符的字符串。

我需要使用dynamic type tests吗?

2 个答案:

答案 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]);
}