我正在将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}
答案 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
})