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

问题描述 投票:4回答:2

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

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

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

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

我需要使用dynamic type tests吗?

flowtype
2个回答
4
投票

不,Flow没有这样的功能。它实际上没有任何依赖类型功能,其他可能包含单个值的类型。

您可以像在JS中一样使用像if (countryCode.length === 2) { ... }这样的测试,但Flow不会在countryCode块中改进if的类型,因为没有Flow类型来表示两个字符的字符串。

相比之下,像if (countryCode !== null) Flow这样的实际动态类型测试会知道countryCode在if块中不是null,并且可以使用该知识进行类型检查。

请注意,从技术上讲,您可以生成一个类型,其中包含从A到Z的26 * 26 = 676个大写字符串:“AA”,“AB”,...,“ZY”,“ZZ”,但这不是改进你的实施。


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]);
}
© www.soinside.com 2019 - 2024. All rights reserved.