打字稿扩大到不确定的联合

时间:2018-11-25 19:38:56

标签: typescript immutable.js

我正在将Immutable.js与Typescript一起使用;我在编译TypeScript时启用了--strict选项,但现在遇到了一个有趣的错误。

我有以下代码:

import { Map } from "immutable";
class MyClass {
    public readonly map: Map<string, MyTypeA>

    public removeFromMap(keys: Seq.Indexed<string>): MyClass {
        const newMap = keys.reduce((r: Map<string, MyTypeA>, v: string, k: number) => {
            return r.remove(v);
        }, this.map);
        ...
    }
}
  

'(r:Map,v:string,k:number)=> Map类型的参数不能分配给'(reduction ?: Map | undefined,value ?: string | undefined,key ?: number | undefined,iter ?: Iterable | undefined)=>地图”。     参数“ r”和“归约”的类型不兼容。       输入“地图|未定义”不能分配给“地图”类型。         无法将“未定义”类型分配给“地图”类型。

我可以通过将代码更改为

来解决此错误。
import { Map } from "immutable";
class MyClass {
    public readonly map: Map<string, MyTypeA>

    public removeFromMap(keys: Seq.Indexed<string>): MyClass {
        const newMap = keys.reduce((r: Map<string, MyTypeA> | undefined, v: string | undefined, k: number | undefined) => {
            return r!.remove(v!);
        }, this.map);
        ...
    }
}

但这非常冗长。为什么在这种情况下严格模式下的TypeScript无法识别类型string还是类型string | undefined?我相信这种类型的扩展会在我的代码库的其他区域中发生,但是由于某种原因,这种情况不会在这里发生。

有没有一种方法可以解决问题?{p}

1 个答案:

答案 0 :(得分:0)

  

我相信这种类型的扩展会在我的代码库的其他区域中发生,但由于某种原因,这种情况不会在这里发生。

何时发生

在安全的情况下

declare var str: string;
declare var strOrUndef: string | undefined;

strOrUndef = str; // OKAY 

什么时候没发生

当它不安全时!您的代码已简化:

function iTakeFunctionThatIWillCallWithUndefined(
    fun: (hehe: string | undefined) => void
){
    fun(undefined);
}

iTakeFunctionThatIWillCallWithUndefined(function(str: string){ // Error
    // I expect it to be a string
})