Emm*_*ery 5 generics typescript immutable.js
我正在查看 facebook 的不可变库及其打字稿绑定。
如果我有这个代码:
const list: User[] = ...;
list.map(user => ...)
lambda 参数的类型user正确User。
但是,如果我导入不可变的List并包装我的数组:
import {Map, List} from "immutable";
List(list).map(user => ...)
现在,让我感到困惑的是,lambda 参数user被推断为User | undefined。即使将呼叫更改为也List<User>(list)无济于事。
查看库的 .d.ts,定义是:
export function List<T>(array: Array<T>): List<T>;
所以我不明白这是怎么回事?
原因写在What's new in TypeScript 2.0中的可选参数和属性部分:
可选参数和属性会自动将 undefined 添加到其类型中,即使它们的类型注释没有明确包含 undefined 也是如此。例如,以下两种类型是相同的:
// Compiled with --strictNullChecks
type T1 = (x?: number) => string;              // x has type number | undefined
type T2 = (x?: number | undefined) => string;  // x has type number | undefined
immutable.js 的定义文件已更改,现在如果您查看map 方法的签名,它看起来像这样:
map<M>(
    mapper: (value: V, key: K, iter: /*this*/Iterable<K, V>) => M,
    context?: any
): /*this*/Iterable<K, M>;
但如果你在此之前进行提交,它看起来像这样:
map<M>(
    mapper: (value?: V, key?: K, iter?: /*this*/Iterable<K, V>) => M,
    context?: any
): /*this*/Iterable<K, M>;
这里value是可选的。
如果您更新定义文件,它将被修复。