TypeScript - 命名参数?
TypeScript - 命名参数?
我正在尝试学习TypeScript和Angular(以及JavaScript)。
在学习Angular教程时,我发现它们做了以下的事情:
在普通的JavaScript中:
function CreateCtrl($scope, $location, Project){ // 做一些事情 }
完整示例可在Angular主页的"Wire up a backend"项目.js示例中查看。
关键是,这些参数可以是任意顺序的(或根本不存在),而Project
实际上是一个用户定义的变量/类型。Angular框架能够将参数映射到实际对象。
那么现在,我如何在TypeScript中重新创建这种类型的功能呢?我希望以某种方式描述Angular的行为,以便让我在TypeScript中进行封装(对这种灵活的属性注入进行强类型约束)。
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)