How to convert array of strings to typescript types?

Viewed 2883

I've this array:

const arr = ["foo", "bar", "loo"]

I need to convert it to a typescript type

type arrTyp = "foo" | "bar" | "loo";

How can I do this in typescript?

1 Answers

Edit for 3.4 and higher:

In 3.4 const assertions were added, so we can get a string literal type tuple using as const:

const arr = ["foo", "bar", "loo"] as const

type arrTyp = typeof arr[number]; // "foo" | "bar" | "loo"

Original

The problem is that arr does not preserve the literal types in the array, it will be infered to string[]. If you use a function to force the inference of string literal type, extracting the type is a simple affair:

function tuple<T extends string[]>(...o: T) {
    return o;
}
const arr = tuple("foo", "bar", "loo")

type arrTyp = typeof arr[number]; // "foo" | "bar" | "loo"

The function forces the compiler to infer a tuple of string literals for arr. So arr will be typed as ["foo", "bar", "loo"]. We can then use a type query to get a union of the elements in the tuple. You can read more about type queries here

Related