代码之家  ›  专栏  ›  技术社区  ›  Arash Motamedi

TypeScript:从字符串数组定义联合类型

  •  6
  • Arash Motamedi  · 技术社区  · 6 年前

    假设我有一个数组:

    const fruits = ["Apple", "Orange", "Pear"];
    

    我想定义一个对象,将每个水果映射到一些有趣的事实:

    interface Facts {
        color: string,
        typicalWeight: number
    }
    
    const fruitFacts: { [key: members of fruits]: Facts } = {
        "Apple": { color: "green", typicalWeight: 150 }
        //
    }
    

    [key: members of fruits]

    奖金:我如何执行 fruitFacts

    2 回复  |  直到 6 年前
        1
  •  52
  •   Ben Regenspan    5 年前

    添加TypeScript 3.4 const assertions 允许将其写成:

    const fruits = ["Apple", "Orange", "Pear"] as const;
    type Fruits = typeof fruits[number]; // "Apple" | "Orange" | "Pear"
    

    as const TypeScript推断 fruits 以上为 readonly["Apple", "Orange", "Pear"] string[] ,防止 typeof fruits[number]

        2
  •  19
  •   Titian Cernicova-Dragomir    5 年前

    可以这样做,但首先需要一个额外的函数来帮助推断数组元素的字符串文本类型。默认情况下,Typescript将推断 string[]

    function stringLiteralArray<T extends string>(a: T[]) {
        return a;
    }
    
    const fruits = stringLiteralArray(["Apple", "Orange", "Pear"]);
    type Fruits = typeof fruits[number]
    

    从3.4开始,您还可以使用const类型断言来代替 stringLiteralArray 功能:

    const fruits = ["Apple", "Orange", "Pear"] as const;
    type Fruits = typeof fruits[number]