以下代码编译。
@Bean
public TomcatEmbeddedServletContainerFactory tomcatFactory() {
return new TomcatEmbeddedServletContainerFactory() {
@Override
protected TomcatEmbeddedServletContainer getTomcatEmbeddedServletContainer(
Tomcat tomcat) {
tomcat.enableNaming();
TomcatEmbeddedServletContainer container =
super.getTomcatEmbeddedServletContainer(tomcat);
for (Container child: container.getTomcat().getHost().findChildren()) {
if (child instanceof Context) {
ClassLoader contextClassLoader =
((Context)child).getLoader().getClassLoader();
Thread.currentThread().setContextClassLoader(contextClassLoader);
break;
}
}
return container;
}
@Override
protected void postProcessContext(Context context) {
ContextResource resource = new ContextResource();
resource.setName("jdbc/myDataSource");
resource.setType(DataSource.class.getName());
resource.setProperty("driverClassName", "your.db.Driver");
resource.setProperty("url", "jdbc:yourDb");
context.getNamingResources().addResource(resource);
}
};
}
但是下面的代码不能编译,即使变量function myFunction(arg1:string, arg2:(msg:string)=>void){ /* do stuff */ }
var args = ["hello", function(msg){ /* do stuff */ }];
myFunction.apply(myFunction, args);
与上面的类型相同。
args
它会抛出以下错误。
function myFunction(arg1:string, arg2:(msg:string)=>void){ /* do stuff */ }
var args = ["hello"].concat(function(msg){ /* do stuff */ });
myFunction.apply(myFunction, args);
知道为什么吗?这是我的代码中的错误还是TypeScript编译器中的错误?
答案 0 :(得分:2)
在TypeScript中,创建数组时,会从数组成员推断出类型。以下代码段为Array<string>
或string[]
var a = ["hello"];
如果您尝试向此数组添加其他值,则必须是字符串:
a.concat("A string");
如果你添加了一个功能,它会警告你它不兼容:
a.concat(() => { return 5; });
这也适用于您的示例,即使您是立即执行此操作,您可以通过添加允许值来判断:
["hello"].concat("A string");
你可以通过扩大数组的类型来解决这个问题:
var args = (<any[]>["hello"]).concat(function(msg){ /* do stuff */ });