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'
