在 Typescript 中实现 ng.IFilterService
Implement ng.IFilterService in Typescript
我在 .ts 文件中有以下内容
module App.Filters {
export class SplitRangeFilter implements ng.IFilterService {
static $inject = ['$filter'];
public static factory(): Function {
return (input: string, splitIndex: number) => {
return input.split('-')[splitIndex];
}
}
}
angular.module("App.Filters", []).filter('SplitRange', () => SplitRangeFilter.factory);
}
它给我一个编译器错误:
Class SplitRangeFilter declared interface IFilterService but does not implement it: Types 'SplitRangeFilter' and 'IFilterService' have incompatible signatures. No matching signature for '<T>(name: string) => T'
我在 angulars 文档中找不到任何这样的签名。关于如何在 VS2015 中消除此编译器错误的任何建议
如果你只是想让它工作而不关心实现 "right" 接口然后删除 implements ng.IFilterService
然后更改你的 Angular 注册语句以执行工厂(即添加 ()
)
angular.module("App.Filters", []).filter('SplitRange', () => SplitRangeFilter.factory());
IFilterService 仅用于通过 TypeScript 编译器向编程过滤器调用添加类型安全。
基于您的代码的正确实现是:
module App.Filters {
// Add filter type to the filter service so that TypeScript can
// perform type checking on future programmatic invokes.
// This app filter service
export interface IAppFilterService extends angular.IFilterService {
(name: 'SplitRange'): (input: string | splitIndex: number) => string | undefined;
}
export class SplitRangeFilter {
constructor() {
return (input: string, splitIndex: number): string | undefined => {
return input.split('-')[splitIndex];
}
}
}
angular.module("App.Filters", []).filter('SplitRange', SplitRangeFilter);
}
这就是 IAppFilterService 在您的代码中的使用方式:
// Usage for IAppFilterService
class AppController {
constructor(private $filter: IAppFilterService) {}
// This will pass without compile warnings
public splitString(val: string, index: number): string | undefined {
return this.$filter('SplitRange')(val, number);
}
// This will throw compile time TypeScript error
public splitNumber(val: number, index: number): string | undefined {
return this.$filter('SplitRange')(val, number);
}
}
我在 .ts 文件中有以下内容
module App.Filters {
export class SplitRangeFilter implements ng.IFilterService {
static $inject = ['$filter'];
public static factory(): Function {
return (input: string, splitIndex: number) => {
return input.split('-')[splitIndex];
}
}
}
angular.module("App.Filters", []).filter('SplitRange', () => SplitRangeFilter.factory);
}
它给我一个编译器错误:
Class SplitRangeFilter declared interface IFilterService but does not implement it: Types 'SplitRangeFilter' and 'IFilterService' have incompatible signatures. No matching signature for '<T>(name: string) => T'
我在 angulars 文档中找不到任何这样的签名。关于如何在 VS2015 中消除此编译器错误的任何建议
如果你只是想让它工作而不关心实现 "right" 接口然后删除 implements ng.IFilterService
然后更改你的 Angular 注册语句以执行工厂(即添加 ()
)
angular.module("App.Filters", []).filter('SplitRange', () => SplitRangeFilter.factory());
IFilterService 仅用于通过 TypeScript 编译器向编程过滤器调用添加类型安全。
基于您的代码的正确实现是:
module App.Filters {
// Add filter type to the filter service so that TypeScript can
// perform type checking on future programmatic invokes.
// This app filter service
export interface IAppFilterService extends angular.IFilterService {
(name: 'SplitRange'): (input: string | splitIndex: number) => string | undefined;
}
export class SplitRangeFilter {
constructor() {
return (input: string, splitIndex: number): string | undefined => {
return input.split('-')[splitIndex];
}
}
}
angular.module("App.Filters", []).filter('SplitRange', SplitRangeFilter);
}
这就是 IAppFilterService 在您的代码中的使用方式:
// Usage for IAppFilterService
class AppController {
constructor(private $filter: IAppFilterService) {}
// This will pass without compile warnings
public splitString(val: string, index: number): string | undefined {
return this.$filter('SplitRange')(val, number);
}
// This will throw compile time TypeScript error
public splitNumber(val: number, index: number): string | undefined {
return this.$filter('SplitRange')(val, number);
}
}