• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Komponent funkcyjny z <T>, jako const [TypeScript, React]

0 głosów
503 wizyt
pytanie zadane 18 maja 2022 w JavaScript przez Oskar Szkurłat Bywalec (2,780 p.)

Cześć, mam pytanie, być może trywialne - jak zapisać w komponencie funkcyjnym przypisanym do zmiennej (stałej dokładnie) przekazany parametr <T>?

Już tłumaczę przykładami. Wiem, że jest możliwe coś takiego i to działa, ale jednak chciałbym się trzymać przyjętego standardu w aplikacji i stosować zapis z przypisaniem funkcji do `const`.

export interface ITestComponentProps<T> {
  dataRow: T[]
}

Więc zamiast tego:

import _ from 'lodash'

import { ITestComponentProps } from './TestComponent.interface'

function TestComponent<T>(props: ITestComponentProps<T>): JSX.Element {
  return <>{_.map(props.dataRow)}</>
}

export default TestComponent

Chciałbym coś takiego osiągnąć:

import _ from 'lodash'

import { ITestComponentProps } from './TestComponent.interface'

const TestComponent = <T> (props: ITestComponentProps<T>): JSX.Element => {
  return <>{_.map(props.dataRow)}</>
}

export default TestComponent

Jest to w ogóle możliwe, a jak tak, to w jaki sposób musiałbym zapisać typ do funkcji?

Odpowiadając na mój zamysł, to tworzę uniwersalny komponent - wrapper. Przykładowo uniwersalną tabelę, która przyjmuje różnego typu dane do wierszy. A `<T>` jest mi niezbędny, żeby potem nie wpisywać `<any>` typów przy innych typach i interfejsach.

Przy okazji, polecacie stosować nazewnictwo T, jakby zgodnie z typescriptem, czy lepiej użyć jakiejś konkretnej nazwy mówiącej, czym właściwie ten typ jest, np. `<IRowData>`?

1 odpowiedź

+1 głos
odpowiedź 18 maja 2022 przez Comandeer Guru (607,290 p.)
wybrane 19 maja 2022 przez Oskar Szkurłat
 
Najlepsza

Hmm, ale Twój zapis powinien działać. Może masz jakąś starą wersję TypeScriptu?

Przy okazji, polecacie stosować nazewnictwo T, jakby zgodnie z typescriptem, czy lepiej użyć jakiejś konkretnej nazwy mówiącej, czym właściwie ten typ jest, np. `<IRowData>`?

Imo T jest na tyle rozpowszechnione, że każdy się domyśli, o co chodzi, czy wręcz będzie oczekiwał takiej nazwy dla generyka. 

komentarz 18 maja 2022 przez Oskar Szkurłat Bywalec (2,780 p.)

Moja wersja TS to `"typescript": "^4.5.5".`

Błąd to: 

JSX element 'T' has no corresponding closing tag.

Błąd

Projekt wygenerowany przez CRA - typescript

Przy poniższym zapisie działa, ale czemu z funkcją strzałkową nie chce, to nie rozumiem.

import _ from 'lodash'

import { ITestComponentProps } from './TestComponent.interface'

const TestComponent = function <T>(props: ITestComponentProps<T>): JSX.Element {
  return <>{_.map(props.dataRow)}</>
}

export default TestComponent

 

1
komentarz 18 maja 2022 przez Comandeer Guru (607,290 p.)
OK, wygląda na to, że się nie da → https://github.com/microsoft/TypeScript/issues/15713#issuecomment-300545248

Ogólnie: przy takim zapisie generyk jest traktowany jako znacznik otwierający w JSX.
1
komentarz 18 maja 2022 przez Comandeer Guru (607,290 p.)

Podobne pytania

0 głosów
1 odpowiedź 689 wizyt
pytanie zadane 14 stycznia 2022 w JavaScript przez Oskar Szkurłat Bywalec (2,780 p.)
+1 głos
2 odpowiedzi 505 wizyt
0 głosów
0 odpowiedzi 180 wizyt
pytanie zadane 4 października 2023 w JavaScript przez reaktywny Nałogowiec (46,230 p.)

93,604 zapytań

142,528 odpowiedzi

322,995 komentarzy

63,090 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Kursy INF.02 i INF.03
...