在Typescript中声明委托types
来自C#背景,我想创build一个数据types,定义一个函数签名。 在C#中,这是一个如下所示的delegate
:
delegate void Greeter (string message); public class Foo { public void SayHi (Greeter g) { g("Hi!"); } }
现在,我想在Typescript中达到类似的效果。 我知道Typescript没有委托types,但只有lambdaexpression式。 我想出了这样的事情:
class Foo { SayHi (greeter: (msg: String) => void) { greeter('Hi!'); } }
虽然这个工作,我想重复使用方法签名(msg:String) => void
的几次,并认为它会更清洁创build一个自定义types – 就像在C#中的委托。
任何想法如何做到这一点?
在TypeScript中,接口可以有呼叫签名。 在你的例子中,你可以像这样声明:
interface Greeter { (message: string): void; } function sayHi(greeter: Greeter) { greeter('Hello!'); } sayHi((msg) => console.log(msg)); // msg is inferred as string
你可以像这样创build一个委托:
type MyDelegate = (input: string) => void;
它为函数指针定义了一个types名称,就像委托人在C#中一样。 以下示例将其与genericstypes参数结合使用:
type Predicate<T> = (item: T) => boolean; export class List<T> extends Array<T> { constructor(...items: T[]){ super(); for(let i of items || []){ this.push(i); } } public hasAny(predicate?: Predicate<T>): boolean { predicate = predicate || (i => true) for(let item of this) { if(predicate(item)) return true; } return false; } }
可调用expression式的types定义(对于人类来说,这是一个可用的草稿,不是BNF或任何forms的) :
callableType: (paramsDef) => returnType paramsDef: MULTIPLE paramDef SEPARATED BY , paramDef: EITHER paramName: paramType OR optionalParamName?: paramTypeWhenDefined OR ...manyParamName: eachParamType[]
例:
var func = something as ((...x: any[]) => any);
然后你可以:
var result = func("a", "b", 2);
我现在发布和使用@ steelbreeze / delegate ; 它与C#委托相比有一些限制,因为它是不可变的,但是在其他方面效果很好(当调用返回所有被调用函数的结果时)。
它可以让你编写代码,如:
import { create as delegate } from "@steelbreeze/delegate"; function world(s: string) { console.log(s + " world"); } const one = delegate(s => console.log(s + " Hello world")); const two = delegate(s => console.log(s + " Hello"), world); one("A"); two("B"); delegate(one, two)("C");