2017-05-03 7 views
1

は有効であると表示されます。それが有効である場合、私はそれを実装する方法活字体関数インタフェースの実装

interface IPredicate { 
    (s: Product): boolean 
    and(IPredicate): IPredicate 
    or(IPredicate): IPredicate 
} 

そのおおよそ次のような作品:

let a: IPredicate = (s: Something) => true 
let b: IPredicate = (s: Something) => false 
let c: IPredicate = a.and(b) 

答えて

2

もう少し冗長:

interface IPredicate<T> { 
    (item: T): boolean 
    and(p: IPredicate<T>): IPredicate<T>; 
    or(p: IPredicate<T>): IPredicate<T>; 
} 

function createPredicate<T>(source: (item: T) => boolean) { 
    let predicate = source as IPredicate<T>; 
    predicate.and = (another:IPredicate<T>) => createPredicate((item: T) => source(item) && another(item)); 
    predicate.or = (another:IPredicate<T>) => createPredicate((item: T) => source(item) || another(item)); 

    return predicate; 
} 

type Something = {}; 

let a: IPredicate<Something> = createPredicate((s: Something) => true); 
let b: IPredicate<Something> = createPredicate((s: Something) => false); 
let c: IPredicate<Something> = a.or(b); 
関連する問題