【问题标题】:How to create a fixed-length type in flow如何在流中创建定长类型
【发布时间】:2017-01-07 06:04:24
【问题描述】:

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

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

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

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

我需要使用dynamic type tests吗?

【问题讨论】:

  • 不,不可能

标签: flowtype


【解决方案1】:

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

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

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

请注意,从技术上讲,您可以生成一个包含从 A 到 Z 的 26*26=676 个大写字符字符串的类型:“AA”、“AB”、...、“ZY”、“ZZ”,但事实并非如此对您的实施的改进。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-22
      • 1970-01-01
      相关资源
      最近更新 更多