SONIC3D icon

TypeScript中的静态函数的interface的变通实现方法

SONIC3D | PRO | 04/10/19 08:54:56 AM UTC | 0 ⭐ | 10414 👁️ | Never ⏰ | []
ECMAScript |

2.42 KB

|

None

|

0 👍

/

0 👎

// TypeScript中的静态函数的interface的变通实现方法
// 进一步参考:https://stackoverflow.com/questions/33719459/how-to-declare-an-interface-with-static-method?lq=1
 
/**
 * TypeScript Constructor Interfaces Proposal
 *
 * Author: Reed Spool
 */
 
/**
 * Root interface for Constructor Interfaces. This is a workaround for
 * TypeScript's lack of "static" methods for classes.
 * 
 * Based on StackOverflow user chris's solution. See 
 * https://stackoverflow.com/a/43484801/1037165 
 * 
 * @interface IConstructor
 * @template InstanceInterface
 */
interface IConstructor<InstanceInterface>
{
  /**
   * Explicitly typed constructor is required, so make an extremely permissive
   * declaration that can be refined in subclasses.
   * 
   * @constructor
   */
  new (...args : any[]) : InstanceInterface;
}
 
/** 
 * That's ALL for the definition. What follows is a comprehensive usage
 * example.
 */
 
// Create a Constructor Interface by extending IConstructor and
// specifiying your Instance Interface. Keep your class open for
// extension with "T extends ...".
interface CMyClass<T extends IMyClass> extends IConstructor<T>
{
  // Specify constructor parameters safely, staying open for extension
  // by specifying any variatic arguments. You don't need to specify
  // a constructor though.
  new (instanceValue : string, ...args : any[]) : T;
 
  // Properties on Constructor Interfaces can be accessed by the
  // Class object.
  aClassProperty : string;
 
  // This is useful for static factory methods.
  aClassMethod () : T
}
 
// Create a normal Instance Interface. IConstructor doesn't require 
// or restrict anything here. You could use anything, including
// `Object` or `any`
interface IMyClass 
{
}
 
// This is the hackish part: Your class must be anonymous so that
// you can specify the type of the variable that holds it. So make a 
// `const` variable of your Constructor Interface's type set to a new
// anonymous class which implements your Instance Interface.
export const MyClass : CMyClass<IMyClass> = class implements IMyClass
{
  // The constructor must satisfy CMyClass's `new` signature.
  constructor (instanceValue : string, ...args : any[])
  {
  }
 
  // We can use the built-in JS `static` keyword to satisfy the interface
  // of CMyClass
  static aClassProperty : string = "myProp";
  static aClassMethod () : IMyClass { return new MyClass(); }
}

Comments

  •  icon
    01/01/70 12:00:00 AM UTC
    Plain Text |

    0 B

    |

    👍

    /

    👎

    
        
  •  icon
    01/01/70 12:00:00 AM UTC
    Plain Text |

    0 B

    |

    👍

    /

    👎