2016-11-18 27 views
1

月底所以,我正在学习打字稿,但我找不到这些参数是如何工作的打字稿参数:在任何一个字符串参数

interface MyInterface { 
    (name?: string): any; 
    new (name?: string): any; 
} 

class MyClass implements MyInterface { 
    (name?: string): any; // This is not working 
} 

我understend什么:名称应该是一个字符串参数,不是强制性的

什么我不下线:如何outisde'任何'的作品?和什么“新”的名字的意思是

来源:角核心文档OutputDecorator: https://github.com/angular/angular/blob/master/modules/%40angular/core/src/metadata/directives.ts#L836

+0

该接口似乎描述了一个函数,它接受一个字符串并返回任何东西(那是什么:任何部分的意思)。但它也必须是一个可以通过构造函数初始化的类(新的部分)。通过单独的打字稿很难完成,但有js结构可以匹配它。 – toskv

回答

0

这些都是调用签名构建签名。具有类型MyInterface

任何为你定义它可以

  • 调用,任选一个string说法。
  • 构造(new -ed),可选地带有string参数。

在两种情况下,主叫或new -ing一个MyInterface将导致any类型的值。


作为该:

class MyClass implements MyInterface { 
    (name?: string): any; // This is not working 
} 

呼叫或构建签名只能出现在一个TypeBody按照the TypeScript spec。类型主体仅用于对象类型文字和interface declarations。这与不允许调用/构造签名的ClassBody略有不同。

在一类,可以代替定义构造函数:

class C { 
    constructor() { 
     console.log("Hi"); 
    } 
} 

但有没有办法让一个类调用。

请注意,执行一些调用和构造签名意味着实例将获得类型,而不是静态的一面。换句话说,你在说MyClass产生的东西将与MyInterface兼容,但是与MyClass本身的静态形状没有任何关系。

没有办法,保证了静态侧具有一定的形状,现在除了像这样黑客:

class MyClass { 
    // ... 
} 

if (!!false) { 
    let x: MyInterface = MyClass; 
}