使用<any>强制参数更通用

时间:2018-01-31 20:55:42

标签: typescript typescript-typings typescript2.0

每当我尝试这样做时,我都无法让它工作,我有这个代码:

router.events.subscribe(val => {
  console.log('router event:', val);
  localStorage.setItem(this.anyRouteKey, val.url);
});

它给了我这个错误:

enter image description here

事实证明,url属性确实存在,这只是打字中的一个错误。所以我想在短期内将val转换为Objectany。所以我尝试这样做,但我尝试的任何工作都没有:

enter image description here

enter image description here

将输入参数强制转换为任何?

的正确方法是什么?

1 个答案:

答案 0 :(得分:2)

这不是一个错误,val类型为Event,它是RouterEvent | RouteConfigLoadStart | RouteConfigLoadEnd | ChildActivationStart | ChildActivationEnd | ActivationStart | ActivationEnd的联合类型,其中只有一些具有url属性。联盟类型只允许访问公共属性,url并不是所有人都可以使用;

如果您使用的是typecript 2.6,则可以使用in类型后卫:

router.events.subscribe(val => {
    if('url' in val) {
        console.log(val.url);
    }
});

另一种选择是使用实际具有url属性的事件类型显式地向lambda键入参数(前提是您不使用2.6中的strictFunctionTypes编译器标志)

router.events.subscribe((val : RouterEvent) => {
    console.log(val.url);
});

或者如果你真的想要去any路线:

router.events.subscribe((val : any) => {
    console.log(val.url);
});