Mam tablicę:

const someArray = ['one', 'two', 'three'];

I mam typ:

type SomeType = 'one' | 'two' | 'three';

Jak mogę uzyskać SomeType od someArray?

0
Igor Zvyagin 2 kwiecień 2020, 13:22

4 odpowiedzi

Najlepsza odpowiedź

Możesz, kosztem zastosowania asercji as const do someArray.

const someArray = ['one', 'two', 'three'] as const;
                                       /* ^------- IMPORTANT!
                                          otherwise it'll just be `string[]` */

type GetItem<T> = T extends ReadonlyArray<infer I> ? I : never;

type SomeType = GetItem<typeof someArray>;  // 'one' | 'two' | 'three'
3
hackape 2 kwiecień 2020, 14:58

Znalazłem jeszcze prostsze rozwiązanie.

const someArray = ['one', 'two', 'three'] as const;
                                       /* ^------- IMPORTANT!
                                          otherwise it'll just be `string[]` */

type SomeType = typeof someArray[number];  // 'one' | 'two' | 'three'
0
Igor 15 październik 2020, 09:55

Nie możesz, ponieważ TypeScript nie jest językiem z typami zależnymi.

TypeScript, podobnie jak prawie każdy inny dobrze znany obecnie istniejący język z typami statycznymi, może tworzyć typy dla wartości, ale nie może tworzyć typów z wartości.

Możesz więc utworzyć typ dla swoich wartości:

const someArray: SomeType[] = ['one', 'two', 'three'];

Ale nie możesz utworzyć typu ze swoich wartości:

type SomeType = infer T for someArray[T] // invented syntax

Mogą to zrobić tylko języki zależnie wpisywane. Niestety nie jest to jeszcze główny nurt. Daj mu jeszcze dekadę, a usłyszysz o tym więcej.

Prawdopodobnie nie oznacza to jednak, że utknąłeś. Z biegiem czasu zdarzyło mi się bardzo kilka razy, kiedy absolutnie nie mogłem dostać się do czcionki tylko dlatego, że język nie był napisany zależnie. Spróbuj zadać inne pytanie i możesz uzyskać satysfakcjonującą odpowiedź. Istnieją sposoby, aby na przykład mieć dostępne typy w czasie wykonywania, na przykład https://github.com/gcanti/ io-ts.

1
Lodewijk Bogaards 2 kwiecień 2020, 10:45

Przez „filtr” w celu zwrócenia ergodycznego spełnienia elementu warunku

-1
zht 2 kwiecień 2020, 10:38