我有一个使用 TypeScript 的 Angular 2 项目。我不明白为什么 TypeScript 实时编译器会抱怨info.map
?
错误消息:未解析的函数或方法 map()
当我在浏览器中运行它时,工作得很好,但我不明白为什么会发生这种情况,更重要的是 TypeScript 如何确定我所在的 if /else 分支。
代码:
let addInfo = (info: string|string[]) => {
if(_.isString(info)){
console.log('info is a string');
infos.push(info);
}else if(_.isArray(info)){
console.log('info is an array');
info.map( x => { infos.push(x) }); // here is the compiling error- map is red.
}
}
这是一个快照:
Typescript 编译器无法将 lodash 的函数调用识别为类型检查。您可以尝试“if(info instanceof String)”,并且在“else”分支中打字稿可以假设“info”是数组。
这对我有用打字稿游乐场 https://www.typescriptlang.org/play/index.html:
let addInfo = (info: string|string[]) => {
if(info instanceof String){
info;
} else {
info.map(s => s);
}
}
Update
感谢@Tamas Hegedus,分享了有关自定义类型保护的知识。我以前没听说过他们。我决定在这里引用打字稿文档 https://www.typescriptlang.org/docs/handbook/advanced-types.html关于用户定义的类型防护:
碰巧 TypeScript 有一个叫做类型保护的东西。
类型保护是执行运行时检查的某种表达式
保证一定范围内的类型。要定义类型保护,我们只需
需要定义一个返回类型为类型谓词的函数:
function isFish(pet: Fish | Bird): pet is Fish {
return (<Fish>pet).swim !== undefined;
}
宠物是鱼是本例中我们的类型谓词。谓词需要
表格参数名称为类型, where 参数名称必须是名字
当前函数签名中的参数。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)