TypeScript - 命名参数?

25 浏览
0 Comments

TypeScript - 命名参数?

我正在尝试学习TypeScript和Angular(以及JavaScript)。

在学习Angular教程时,我发现它们做了以下的事情:

在普通的JavaScript中:

function CreateCtrl($scope, $location, Project){
// 做一些事情
}

完整示例可在Angular主页的"Wire up a backend"项目.js示例中查看。

关键是,这些参数可以是任意顺序的(或根本不存在),而Project实际上是一个用户定义的变量/类型。Angular框架能够将参数映射到实际对象。

那么现在,我如何在TypeScript中重新创建这种类型的功能呢?我希望以某种方式描述Angular的行为,以便让我在TypeScript中进行封装(对这种灵活的属性注入进行强类型约束)。

0
0 Comments

TypeScript - Named arguments?

在这篇文章中,我们将讨论TypeScript中的一个问题:命名参数。问题的出现原因以及解决方法。

在Definitely Typed上有一个AngularJS的类型定义,它允许你在TypeScript中使用Angular。如果我要为一个已经存在的函数创建一个定义(在没有命名参数的情况下),我可能会按特定的顺序定义它们(即使我知道在普通的JavaScript中,它们可以以不同的顺序传递),或者创建一组与我想要公开的可能性相匹配的函数重载,就像这样:

interface Example {
    ($scope: bool, $location: string, Project: number): void;
    ($location: string, $scope: bool, Project: number): void;
    (Project: number, $scope: bool, $location: string): void;
}
declare var example: Example;

当我尝试调用`example(`时,我会得到智能感知提供的三个选项,如果我没有使用其中的一种组合,编译器会给出警告。

在JavaScript中,命名参数通常是使用一个对象创建的,所以如果我要编写一个可以以这种方式接受参数的新方法,我会这样做:

interface ExampleArguments {
    scope: bool;
    location: string;
    project: number;
}
var example = function (exampleArguments: ExampleArguments) {
};
example({ scope: true, project: 4, location: 'hi' });

这种方法在TypeScript中是静态类型和检查的。

基本上,你是在说“不行,你做不到”。对吗?我使用了angularjs的d.ts文件,但没有起到作用。另外,你下面的例子中,angular的框架进行了调用,所以我对此没有任何控制权。也许TypeScript现在没有办法处理这个问题了。

命名参数曾经提出过,但被TypeScript语言规范拒绝了,所以不可能完全按照你描述的方式实现。但你可以使它们按照固定的顺序,从而达到你想要的效果(尽管Angular可以接受任何顺序)。[typescript.codeplex.com/workitem/256](http://typescript.codeplex.com/workitem/256)

0