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.
