Typescript使用函数参数应用+ concat

时间:2015-07-18 21:03:46

标签: typescript

以下代码编译。

@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编译器中的错误?

1 个答案:

答案 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 */ });