TypeScript generisk typ och undefined


Jag tittar på Facebooks oföränderliga bibliotek och deras TypeScript-bindningar.

Om jag har den här koden:

const list: User[] = ...;
list.map(user => ...)

Typen på lambda-parametern user är korrekt User.

Men om jag importerar immutables List och omsluter min array:

import {Map, List} from "immutable";
List(list).map(user => ...)

Nu, och det förbluffar mig, antas lambda-parametern user vara User | undefined. Även att ändra anropet till List<User>(list) hjälper inte.

Om man tittar på .d.ts för biblioteket, är definitionen:

export function List<T>(array: Array<T>): List<T>;

Så jag förstår inte vad som pågår här?

Svar #1

Anledningen till detta står skriven i What's new in TypeScript 2.0 i avsnittet om valfria parametrar och egenskaper:

Valfria parametrar och egenskaper får automatiskt undefined tillagt i sina typer, även när deras typenotationer inte specifikt inkluderar undefined. Till exempel är de följande två typerna identiska:

// Compiled with --strictNullChecks
type T1 = (x?: number) => string;              // x has type number | undefined
type T2 = (x?: number | undefined) => string;  // x has type number | undefined

Redigera

Definitionsfilen för immutable.js ändrades, nu om du tittar på signaturen för map-metoden ser den ut så här:

map<M>(
    mapper: (value: V, key: K, iter: /*this*/Iterable<K, V>) => M,
    context?: any
): /*this*/Iterable<K, M>;

Men om du går ett commit innan det ser det ut så här:

map<M>(
    mapper: (value?: V, key?: K, iter?: /*this*/Iterable<K, V>) => M,
    context?: any
): /*this*/Iterable<K, M>;

Och här är value valfritt.

Om du uppdaterar definitionsfilen kommer det att åtgärdas.

Relaterade artiklar