打字稿泛型类型和未定义

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)

所以我不明白这是怎么回事?

Nit*_*mer 4

原因写在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是可选的。

如果您更新定义文件,它将被修复。