javascript - immutables typescript type definisjoner: hvorfor opererer concat på any?


Jeg forstår ikke hvorfor definisjonen av concat i Collection<K, V> for eksempel bruker any:

concat(...valuesOrCollections: Array<any>): Collection<any, any>;

hvorfor kunne det ikke være:

concat(...valuesOrCollections: Array<V>): Collection<K, V>;

?

Svar #1

Jeg er ikke sikker på hvorfor det er signaturen, men du bør kunne utvide modulen/grensesnittet for å legge til en generell signatur.
Noe sånt som:

declare module "immutable" {
    module Collection {
       interface Collection<K, V> {
           concat(...valuesOrCollections: Array<V>): Collection<K, V>;
       }
    }
}

Svar #2

Ok, så jeg har prøvd å endre typedefinisjonen i kilden til immutables og kjøre testene, og jeg ser nå hvorfor de har den typedefinisjonen de har.

De ønsker å støtte stort sett alt, som i (åpenbart) den originale JS-APIen. For eksempel å legge til objekt-egenskaper:

  it('concats objects to keyed seq', () => {
    let a = Seq({a: 1, b: 2, c: 3});
    let b = {d: 4, e: 5, f: 6};
    expect(a.concat(b).toObject()).toEqual({a: 1, b: 2, c: 3, d: 4, e: 5, f: 6});
  });

å legge til flere verdier direkte som parametere:

  it('concats values', () => {
    let a = Seq.of(1, 2, 3);
    expect(a.concat(4, 5, 6).size).toBe(6);
    expect(a.concat(4, 5, 6).toArray()).toEqual([1, 2, 3, 4, 5, 6]);
  });

eller til og med legge til flere arrays i parametrene:

  it('concats multiple arguments', () => {
    let a = Seq.of(1, 2, 3);
    let b = [4, 5, 6];
    let c = [7, 8, 9];
    expect(a.concat(b, c).size).toBe(9);
    expect(a.concat(b, c).toArray()).toEqual([1, 2, 3, 4, 5, 6, 7, 8, 9]);
  });

For å få dette på en typesikker måte i TypeScript, antar jeg at vi ville trengt flere overbelastninger (concatCollection, concatValues, concatProperties og så videre).

PS: for å være rettferdig var parameternavnet i den opprinnelige definisjonen et godt hint: valuesOrCollections

Oppdatering: etter at jeg åpnet en liten PR, implementerte vedlikeholderen en grundig fullstendig typesikker løsning.