typescript - Pretvori tip literalnog niza u literalnu vrijednost


U TypeScriptu možemo imati tipove string literal koji nam omogućuju da radimo stvari poput:

type HelloString = "Hello";

Ovo mi omogućuje da definiram nešto poput niza enumeracije na sljedeći način:

namespace Literals {
    export type One = "one";
    export type Two = "two";
}

I tada mogu definirati uniju:

type Literal = Literals.One | Literals.Two;

Postoji li način da se jedinstvena vrijednost Literals.One izdvoji kao tip Literals.One?

Razlog za ovo je taj što kada definiram funkciju ovako:

function doSomething(literal : Literal) {

}

Stvarno bih volio napraviti sljedeće:

doSomething(Literals.One);

Ali ne mogu. Moram napisati:

doSomething("one");

Odgovor #1

Unutar imenskog prostora možete imati tipove i vrijednosti istog imena, tako da možete definirati konstante za te vrijednosti:

namespace Literals {
    export type One = "one";
    export type Two = "two";
    export const One: One = "one";
    export const Two: Two = "two";
}

const s: Literals.One = Literals.One;
console.log(s);

Na GitHubu postoji prijedlog za string enumeracije, predlažu da je trenutno najbolje rješenje primjer gore.

Odgovor #2

Pretvaranje tipa string literal u doslovnu vrijednost moguće je pomoću prilagođenih transformatora (https://github.com/Microsoft/TypeScript/pull/13940), koji je dostupan u typescript@next.

Molim vas, pogledajte moj npm paket, ts-transformer-enumerate.

Primjer korištenja:

// The signature of `enumerate` here is `function enumerate<T extends string>(): { [K in T]: K };`
import { enumerate } from 'ts-transformer-enumerate';

type Colors = 'green' | 'yellow' | 'red';
const Colors = enumerate<Colors>();

console.log(Colors.green); // 'green'
console.log(Colors.yellow); // 'yellow'
console.log(Colors.red); // 'red'

Povezani članci