Emm*_*ery 5 generics typescript immutable.js
我正在查看 facebook 的不可变库及其打字稿绑定。
如果我有这个代码:
const list: User[] = ...;
list.map(user => ...)
Run Code Online (Sandbox Code Playgroud)
lambda 参数的类型user正确User。
但是,如果我导入不可变的List并包装我的数组:
import {Map, List} from "immutable";
List(list).map(user => ...)
Run Code Online (Sandbox Code Playgroud)
现在,让我感到困惑的是,lambda 参数user被推断为User | undefined。即使将呼叫更改为也List<User>(list)无济于事。
查看库的 .d.ts,定义是:
export function List<T>(array: Array<T>): List<T>;
Run Code Online (Sandbox Code Playgroud)
所以我不明白这是怎么回事?
原因写在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
Run Code Online (Sandbox Code Playgroud)
immutable.js 的定义文件已更改,现在如果您查看map 方法的签名,它看起来像这样:
map<M>(
mapper: (value: V, key: K, iter: /*this*/Iterable<K, V>) => M,
context?: any
): /*this*/Iterable<K, M>;
Run Code Online (Sandbox Code Playgroud)
但如果你在此之前进行提交,它看起来像这样:
map<M>(
mapper: (value?: V, key?: K, iter?: /*this*/Iterable<K, V>) => M,
context?: any
): /*this*/Iterable<K, M>;
Run Code Online (Sandbox Code Playgroud)
这里value是可选的。
如果您更新定义文件,它将被修复。
| 归档时间: |
|
| 查看次数: |
18371 次 |
| 最近记录: |