✅ Nowości, motywy, wtyczki WEB i WordPress. Tutaj dzielimy się wskazówkami i najlepszymi rozwiązaniami dla stron internetowych.

TypeScript: wybrane właściwości opcjonalne z częściowym i pominięciem

23

Gdy używasz narzędzia Partialdo typu, wszystkie właściwości typu stają się opcjonalne. Zobaczmy, jak możemy skomponować to narzędzie z innym, Omit, aby uczynić opcjonalnymi tylko niektóre właściwości tego typu. W końcu utworzymy typ narzędzia za pomocą generyków TypeScript, aby zastosować to na dowolnym typie.

Ustaw wszystkie właściwości typu jako opcjonalne

Narzędzia Partiali Omitsą dobrze znane w dziedzinie TypeScript, ponieważ są bardzo przydatne do szybkiego zastosowania ich do typu i uzyskania zasadniczo nowego typu. Partial<T>przekonwertuje wszystkie klucze danego typu na opcjonalne. Jeśli na przykład masz ten typ:

interface Band {
    lead: string
    guitar: string
    bass: string
    drums: string
    keyboard: string
}

wszystkie właściwości są wymagane, gdy coś ma ten typ. Jeśli chcesz przypisać taki obiekt:

const FooFighters: Band = {
    lead: 'Dave Grohl',
    guitar: 'Pat Smears',
    bass: 'Nate Mendel',
    drums: 'Taylor Williams',
}

nie powiedzie się, ponieważ brakuje keyboardwłaściwości. Teraz moglibyśmy oznaczyć tę właściwość jako opcjonalną, a TypeScript łatwo nam to umożliwia. Najprostszym sposobem na to jest dodanie znaku zapytania do jego nazwy. W takim przypadku, jeśli istnieje możliwość edycji oryginalnego typu, możesz przejść do niego i zmodyfikować go w ten sposób:

interface Band {
    lead: string
    guitar: string
    bass: string
    drums: string
    keyboard?: string
}

Świetny. Teraz poprzednie zadanie się powiedzie, ponieważ keyboardnie jest już wymagane. Ale co, jeśli z jakiegokolwiek powodu nie można zmienić oryginalnego typu? To, co możesz szybko zrobić w takich przypadkach, to zastosować Partialsię do tego typu:

type NotAllTheBand = Partial

const FooFighters: NotAllTheBand = {
    lead: 'Dave Grohl',
    guitar: 'Pat Smears',
    bass: 'Nate Mendel',
    drums: 'Taylor Williams',
}

To przestaje wymuszać wszystkie właściwości, czyniąc je opcjonalnymi. Może czasami tego chcemy, ale co, jeśli chcemy, aby tylko jedna właściwość była opcjonalna i uniknąć modyfikowania oryginalnego typu?

Usuwanie właściwości z typu

Zanim przejdziemy do tego i zobaczymy, jak to działa, zobaczmy inne narzędzie, które nam w tym pomoże: Omit. Ten typ narzędzia usuwa właściwości z typu, w którym jest stosowany. Chociaż Partialnie przyjmuje innych argumentów niż typ, Omitprzyjmuje typ oraz właściwości, które chcesz usunąć: Omit<T, K>.

To nie jest tak Partial, że czyni je opcjonalnymi: Omitcałkowicie wymazuje je z typu. Kiedy używasz Partial<Band>, to tak, jakbyś to zrobił:

interface Band {
    lead?: string
    guitar?: string
    bass?: string
    drums?: string
    keyboard?: string
}

Jednak gdy używasz Omit<Band, 'keyboard'>, to tak, jakbyś to zrobił:

interface Band {
    lead: string
    guitar: string
    bass: string
    drums: string
}

Teraz zaczyna to mieć sens, prawda? Czy możesz sobie wyobrazić, co moglibyśmy zrobić w TypeScript, jeśli mamy typ, który ma wszystkie właściwości oryginalnego zestawu jako opcjonalny, a inny typ ma tylko te właściwości, których chcemy wymagać? Gdyby tylko istniał sposób… przecinania się tych typów, prawda?

Przecinające się typy

Tak, w TypeScript można użyć znaku ampersand &, operatora przecięcia typu. Ten operator, mając dwa typy, konstruuje nowy z właściwościami należącymi do obu typów:

interface SomeType {
    propA: string
    propB: number
}

interface AnotherType {
    propC: boolean
    propD: Array
}

type IntersectedType = SomeType & AnotherType

Do tej pory prawdopodobnie już się zorientowałeś: zamierzamy przeciąć typ częściowy i typ, w którym usunęliśmy niektóre jego właściwości.

Ustaw wybrane właściwości typu jako opcjonalne

Spróbujmy to zrozumieć. Podczas nauki języka TypeScript ważne jest, aby zracjonalizować to, co dzieje się z naszymi typami.

Zamierzamy pobrać typ, który ma wszystkie właściwości ustawione jako opcjonalne dzięki Partialzastosowaniu na nim. Następnie przetniemy go z typem, który ma wybrane właściwości usunięte przez Omit. Zobaczmy przykład:

interface SomeType {
    propA: string
    propB: number
}

type OptionalPropB = Partial & Omit

Mamy teraz nowy typ, bez modyfikowania oryginalnego typu, który wygląda następująco:

type OptionalPropB = {
    propA: string
    propB?: string
}

Dzieje się tak, ponieważ pobieramy właściwości propA?z propB?typu produkowanego przez Partiali przecinamy je z propAtypem produkowanym przez Omit.

Ogólne narzędzia TypeScript

Ok, teraz nasz nowy typ działa i możemy mieć tylko wybrane właściwości oznaczone jako opcjonalne bez modyfikowania oryginalnego typu. Jednak ta linia

type OptionalPropB = Partial & Omit

Jest zbyt gadatliwy, dość brzydki i nużący, by pisać za każdym razem. Co ważniejsze, nie zadziała dla innego typu, za każdym razem będziemy musieli napisać to od nowa. Czy możemy go skrócić i upiększyć i sprawić, by działał dla każdego typu? Tak, TypeScript pozwala nam tutaj użyć generyków i stworzyć własny typ narzędzia:

type Optional = Partial & Omit

A teraz mamy własny typ narzędzia TypeScript zaimplementowany z rodzajami, których możemy użyć, aby uczynić wybrane właściwości typu opcjonalnymi w dowolnym typie. Możemy go użyć tak:

type TypeWithOptionalProp = Optional

Zauważysz, że podpis jest podobny do Pomiń: to narzędzie przyjmuje typ, na którym ma działać, oraz właściwości, które będą opcjonalne. Jeśli masz więcej, możesz skorzystać z operatora union:

type TypeWithOptionalProps = Optional

Słowa zamykające

Możesz teraz zapisać ten ogólny typ narzędzia w pliku i wyeksportować go, aby używać go w całej aplikacji. Oto link do placu zabaw TypeScript, w którym dodałem kod z tego artykułu i skomentowałem go, dzięki czemu można zobaczyć, co się dzieje, patrząc na Partial, Omiti nasz ogólny typ narzędzia.

Świat generyków i narzędzi jest fantastyczny w TypeScript. Wejdź w to i zacznij eksperymentować!

Źródło nagrywania: startfunction.com

Ta strona korzysta z plików cookie, aby poprawić Twoje wrażenia. Zakładamy, że nie masz nic przeciwko, ale możesz zrezygnować, jeśli chcesz. Akceptuję Więcej szczegółów