如何为扩展对象的函数创建typescript定义

时间:2016-02-23 07:25:43

标签: typescript

第三方库中有功能扩展对象以向其添加更多功能。例如seamless-immutable

我想为这样的库创建定义文件。

中我想到了一些东西
interface ImmutableMethods<T> extends T{
    set?<U>(key: string | number, value: any): T | U;
    setIn?<U>(keys: Array<string>, value: any): T | U;
    ...
}
function Immutable<T>(obj: T, options?): ImmutableMethods<T>

然后我将能够将自己的类型声明为:

interface Type1 {prop1, prop2}
interface Type2 {propOfType1: ImmutableMethods<Type1>}
var immutableType2:Type2 = Immutable(...)

然后我将在所有对象上使用Immutable函数。

但问题是,行interface ImmutableMethods<T> extends T给了我一个错误“一个接口可能只扩展一个类或另一个接口”

有没有办法声明T是一个接口,还是一种其他方式来获得这种扩展行为?

1 个答案:

答案 0 :(得分:2)

您可以使用交集类型来实现此行为。为额外功能定义一个接口,并定义一个T&amp;接口。我对您的代码的修改:

<form action="./Login.php" method="post" onsubmit="return checkInput();">
  <table width="300" border="1">
    <tbody>
      <tr>
        <th>UserName:</th>
        <td>
          <input class="box" type="text" value="" name="uname" id="uname">
        </td>
      </tr>
      <tr>
        <th>Password:</th>
        <td>
          <input class="box" type="password" value="" name="pword" id="uname">
        </td>
      </tr>
    </tbody>
  </table>
  <input type="hidden" id="infoDis" value="" />
  <input type="submit" value="Log-in" name="login">
  <input type="submit" value="Reset" name="reset">
</form>

Options +FollowSymLinks -MultiViews # Turn mod_rewrite on RewriteEngine On RewriteBase / RewriteRule ^portal/(.*)$ /$1 [L,NC,R] RewriteRule ^subportal/(.*)$ /$0 [L,NC,R] 接口定义了所涉及的功能。 interface ImmutableMethods<T> { set?<U>(key: string | number, value: any): T | U; setIn?<U>(keys: Array<string>, value: any): T | U; } type ImmutableExtended<T> = ImmutableMethods<T> & T; interface Type1 { prop1: string, prop2: string } interface Type2 { propOfType1: ImmutableExtended<Type1> } var immutableType2: Type2 = ...; 类型是我们实际想要用于扩展对象的接口,当然您可以随意命名这些接口。