2 votes

Étendre une interface en TypeScript et la rendre égale à quelque chose (Generics) ?

J'ai rencontré une déclaration de type dans la bibliothèque react-router qui me pose beaucoup de problèmes de compréhension :

export interface RouteComponentProps<
    Params extends { [K in keyof Params]?: string } = {},
    C extends StaticContext = StaticContext,
    S = H.LocationState
> {
    ...
}

La première ligne des génériques est la plus difficile pour moi. Et j'aimerais avoir de l'aide à ce sujet...

Params extends { [K in keyof Params]?: string } = {}

D'après ce que j'ai compris, nous prenons une interface appelée Params en tant qu'argument, puis nous rendons chaque élément de cette interface facultatif. Nous manipulons donc l'interface passée.

J'ai également beaucoup de mal à comprendre le signe égal = {} . Qu'est-ce que cela signifie d'étendre une interface et de la rendre égale à quelque chose ? Merci de votre compréhension.

2voto

Maciej Sikora Points 6777

Explications sur le générique Params

Params extends { [K in keyof Params]?: string } = {}

Cela signifie que Params doit être un objet (carte clé->valeur) qui peut avoir toutes les propriétés optionnelles et toutes ces propriétés seront de type string . {} signifie le type par défaut lorsque nous ne mettons pas l'argument. J'ai dit que les propriétés peuvent être, mais ne doivent pas être optionnelles, comme le dit extends vous pouvez lire is assignable to Ainsi, par exemple, un objet possédant toutes les propriétés requises ou certaines d'entre elles répondra à cette exigence. Envisagez :

// function which has Params property
const f = <Params extends { [K in keyof Params]?: string } = {}>(p: Params) => p;
type A = {
    a: string // required field
}
f({ a: 'str' } as A) // is ok, pass the interface
type B = {
    b?: string // not required field
}
f({} as B) // is ok pass the interface

Alors vraiment Params signifie tout objet avec des propriétés de type chaîne de caractères, qu'elles soient requises ou non. Cela signifie également que l'objet vide {} peut être utilisé car nous n'exigeons aucune propriété.

Explication des autres types génériques

Les lignes suivantes sont assez simples :

C extends StaticContext = StaticContext

Type C doit être assignable au type StaticContext et doit donc posséder toutes les propriétés de StaticContext si nous supposons qu'il s'agit d'un objet

S = H.LocationState

Type S peut être n'importe quoi, mais s'il n'est pas fourni, il le sera par défaut. H.LocationState

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X