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.
