J'ai beaucoup de mal à comprendre les types d'intersection. Voici ce à quoi je fais référence:

type FooList = Foo[] & {
    bar: string
};

interface Foo {
    baz: string;
}

Après beaucoup de bidouilles, je suis incapable de créer un tableau typé de FooList.

Ces typages ne sont pas les miens, ils proviennent de .

Ces types signifient-ils que FooList doit être un tableau de Foo s et avoir également un objet bar? Chaque objet Foo doit-il contenir une propriété bar?

Voici le lien vers le terrain de jeu

1
César Alberca 16 août 2017 à 18:10

2 réponses

Regardez ma démo d'utilisation.

type LinkedList<T> = T & { next: LinkedList<T> };

interface Person {
    name: string;
}

var people: LinkedList<Person>;
var person: Person = { name: "Joey" };
var childPerson: Person = { name: "James" };
var grandChildPerson: Person = { name: "John" };

people = person;
people.next = childPerson;
people.next.next = grandChildPerson;

alert(JSON.stringify(people));

Consultez la documentation dactylographiée des alias de type et des types d'intersection

0
J. Konárek 16 août 2017 à 20:01

FooList est un tableau avec des éléments de type Foo qui a également une propriété de chaîne nommée bar.

Voici comment vous le créeriez:

function createFooList(bar: string, ...items: Foo[]): FooList {
    const arr = [] as FooList;
    arr.bar = bar;
    arr.push(...items);
    return arr;
}

Ou:

function createFooList(bar: string, ...items: Foo[]): FooList {
    (items as FooList).bar = bar;
    return items as FooList;
}
1
Nitzan Tomer 16 août 2017 à 15:16