SystemJS:YouTube API外部JS库被误认为是本地TypeScript模块

SystemJS:YouTube API外部JS库被误认为是本地TypeScript模块,typescript,youtube-api,systemjs,youtube-javascript-api,Typescript,Youtube Api,Systemjs,Youtube Javascript Api,训练我的打字和角度技巧。首先,现在将的两个脚本转换为只是类型脚本。我能够转换Scroller脚本,但YouTube API有问题,因为它是一个远程外部JS文件,而不是SystemJS模块 我无法让API在加载模块后触发模块的函数。因此,我发现使用“等待导入”应该是一种方式,但它不起作用 SystemJS.config({ 地图:{ youtube:“https://www.youtube.com/iframe_api" }, 元:{ "https://www.youtube.com/ifram

训练我的打字和角度技巧。首先,现在将的两个脚本转换为只是类型脚本。我能够转换Scroller脚本,但YouTube API有问题,因为它是一个远程外部JS文件,而不是SystemJS模块

我无法让API在加载模块后触发模块的函数。因此,我发现使用“等待导入”应该是一种方式,但它不起作用

SystemJS.config({
地图:{
youtube:“https://www.youtube.com/iframe_api"
},
元:{
"https://www.youtube.com/iframe_api": {
“格式”:“全局”,
“导出”:“youtube”,
“scriptLoad”:true,
“构建”:错误
}
}
});
...
导出默认类YouTube服务{
异步加载API(){
试一试{
等待导入('youtube');//自动注入脚本标记
log(“加载了API”);
}
捕获(e){
错误('YouTube API加载失败');

}
当然,被认为是不干净的注入脚本的方法是有效的:

试试看{
var tag=document.createElement('script');
tag.src=”https://www.youtube.com/iframe_api";
var firstScriptTag=document.getElementsByTagName('script')[0];
if(firstScriptTag.parentNode!=null){
firstScriptTag.parentNode.insertBefore(标记,firstScriptTag);
}
//等待导入(youtube);//自动注入脚本标记
log(“加载了API”);
}捕获(e){
console.error('YouTube API加载失败:'+e);

}
由于YouTube API最初设计为全局加载,
@types/YouTube
描述了它定义的全局
YT
变量。您使用SystemJS配置并试图导入的
YouTube
虚拟模块没有在TypeScript的任何位置声明。由于名称匹配,TypeScript正在
@types/youtube
中查找
youtube
模块的声明,但它不在那里。您需要添加一个声明,仅表明
youtube
模块与
@types/youtube
声明的
YT
全局变量相同。创建一个新文件
declaration.d.ts
包含:

declare module "youtube" {
    export = YT;
}
打字脚本错误应该会消失


另一方面,SystemJS配置条目中的
导出
不应该是
YT
,而不是
youtube

“声明变量youtube:string;”替换字符串编译,但等待抛出一个错误:“youtube未定义”意味着配置被忽略。使声明生效,但它仍然忽略SystemJS配置,请参阅更新的源代码链接。我认为使用“System”或“SystemJS”无关紧要。然后我面临错误:“youtube API失败。”ed to load:TypeError:context_1.import不是一个函数,它看起来SystemJS 0.21不支持动态导入。您必须转到SystemJS 2.0(这需要一系列其他配置更改)或找到其他解决方案:(不,等等,我想我成功地使用了0.21.5而不是0.19.22.Yep,一旦创建了声明文件并使用了最新版本的SystemJS,它似乎工作得很好。2.0对我来说太新了,我现在无法尝试。谢谢你的时间,Matt!