TypeScript: Define a union type from an array of strings

前端 未结 2 1522
广开言路
广开言路 2020-12-24 12:06

I can\'t be the first person coming across this, but my searches have not turned up any useful leads yet. Would greatly appreciate some expert TypeScript advice.

Say

相关标签:
2条回答
  • 2020-12-24 12:41

    TypeScript 3.4 added const assertions which allow for writing this as:

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

    With as const TypeScript infers the type of fruits above as readonly["Apple", "Orange", "Pear"]. Previously, it would infer it as string[], preventing typeof fruits[number] from producing the desired union type.

    0 讨论(0)
  • 2020-12-24 12:41

    It can be done but first you need an extra function to help infer the string literal type for the array elements. By default Typescript will infer string[] for an array even if it is a constant. After we have an array of string literal types we can just use a type query to get the desired type

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

    Since 3.4 you can also use a const type assertion instead of the stringLiteralArray function:

    const fruits = ["Apple", "Orange", "Pear"] as const;
    type Fruits = typeof fruits[number]
    
    0 讨论(0)
提交回复
热议问题