meteor 对typescript的支持上存在问题,造成typescript中引入的一些包无法找到。

解决方法:

添加 meteor.d.ts 的定义补充文件到/

下载位置:

wget https://github.com/zencodex/snippets/raw/master/meteor.d.ts

vim /typing.d.ts

/// <reference path="meteor.d.ts" />

完成,如果仍有未定义的函数,变量出现,自己在 meteor.d.ts 里添加即可。

完整的meteor.d.ts 代码:

// Type definitions for Meteor
// Project: http://www.meteor.com/
// Definitions by: Dave Allen <https://github.com/fullflavedave>
// Definitions: https://github.com/borisyankov/DefinitelyTyped
// Changed by ZenCodex: https://github.com/zencodex/snippets/blob/master/meteor.d.ts

/**
 * These are the common (for client and server) modules and interfaces that can't be automatically generated from the Meteor data.js file
 */

interface EJSONable {
  [key: string]: number | string | boolean | Object | number[] | string[] | Object[] | Date | Uint8Array | EJSON.CustomType;
}
interface JSONable {
  [key: string]: number | string | boolean | Object | number[] | string[] | Object[];
}
interface EJSON extends EJSONable { }

declare module "meteor/check" {
  export module Match {
    export var Any: any;
    export var String: any;
    export var Integer: any;
    export var Boolean: any;
    export var undefined: any;
    //function null();  // not allowed in TypeScript
    export var Object: any;
    export function Optional(pattern: any): boolean;
    export function ObjectIncluding(dico: any): boolean;
    export function OneOf(...patterns: any[]): any;
    export function Where(condition: any): any;
  }

  export function check(value: any, pattern: any): void;
}


declare module "meteor/meteor" {
  export module Meteor {
    interface UserEmail {
      address: string;
      verified: boolean;
    }

    interface User {
      _id?: string;
      username?: string;
      emails?: Meteor.UserEmail[];
      createdAt?: number;
      profile?: any;
      services?: any;
    }

    enum StatusEnum {
      connected,
      connecting,
      failed,
      waiting,
      offline
    }

    interface LiveQueryHandle {
      stop(): void;
    }


  }
}

declare module "meteor/ddp" {
  import { Meteor } from "meteor/meteor";

  export module DDP {
    interface DDPStatic {
      subscribe(name: string, ...rest: any[]): Meteor.SubscriptionHandle;
      call(method: string, ...parameters: any[]): void;
      apply(method: string, ...parameters: any[]): void;
      methods(IMeteorMethodsDictionary: any): any;
      status(): DDPStatus;
      reconnect(): void;
      disconnect(): void;
      onReconnect(): void;
    }

    interface DDPStatus {
      connected: boolean;
      status: Meteor.StatusEnum;
      retryCount: number;
      //To turn this into an interval until the next reconnection, use retryTime - (new Date()).getTime()
      retryTime?: number;
      reason?: string;
    }
  }
}

declare module "meteor/mongo" {
  export module Mongo {
    interface Selector {
      [key: string]: any;
    }
    interface Selector extends Object { }
    interface Modifier { }
    interface SortSpecifier { }
    interface FieldSpecifier {
      [id: string]: Number;
    }
  }
}

declare module "meteor/http" {
  export module HTTP {

    interface HTTPRequest {
      content?: string;
      data?: any;
      query?: string;
      params?: { [id: string]: string };
      auth?: string;
      headers?: { [id: string]: string };
      timeout?: number;
      followRedirects?: boolean;
    }

    interface HTTPResponse {
      statusCode?: number;
      headers?: { [id: string]: string };
      content?: string;
      data?: any;
    }

    function call(method: string, url: string, options?: HTTP.HTTPRequest, asyncCallback?: Function): HTTP.HTTPResponse;
    function del(url: string, callOptions?: HTTP.HTTPRequest, asyncCallback?: Function): HTTP.HTTPResponse;
    function get(url: string, callOptions?: HTTP.HTTPRequest, asyncCallback?: Function): HTTP.HTTPResponse;
    function post(url: string, callOptions?: HTTP.HTTPRequest, asyncCallback?: Function): HTTP.HTTPResponse;
    function put(url: string, callOptions?: HTTP.HTTPRequest, asyncCallback?: Function): HTTP.HTTPResponse;
  }
}

declare module "meteor/random" {
  export module Random {
    function id(numberOfChars?: number): string;
    function secret(numberOfChars?: number): string;
    function fraction(): number;
    function hexString(numberOfDigits: number): string; // @param numberOfDigits, @returns a random hex string of the given length
    function choice(array: any[]): string; // @param array, @return a random element in array
    function choice(str: string): string; // @param str, @return a random char in str
  }
}

/**
 * These are the client modules and interfaces that can't be automatically generated from the Meteor data.js file
 */

declare module "meteor/meteor" {
  import { Blaze } from "meteor/blaze";

  export module Meteor {
    /** Start definitions for Template **/
    interface Event {
      type: string;
      target: HTMLElement;
      currentTarget: HTMLElement;
      which: number;
      stopPropagation(): void;
      stopImmediatePropagation(): void;
      preventDefault(): void;
      isPropagationStopped(): boolean;
      isImmediatePropagationStopped(): boolean;
      isDefaultPrevented(): boolean;
    }

    interface EventHandlerFunction extends Function {
      (event?: Meteor.Event, templateInstance?: Blaze.TemplateInstance): void;
    }

    interface EventMap {
      [id: string]: Meteor.EventHandlerFunction;
    }
    /** End definitions for Template **/

    interface LoginWithExternalServiceOptions {
      requestPermissions?: string[];
      requestOfflineToken?: Boolean;
      forceApprovalPrompt?: Boolean;
      userEmail?: string;
      loginStyle?: string;
    }

    function loginWithMeteorDeveloperAccount(options?: Meteor.LoginWithExternalServiceOptions, callback?: Function): void;
    function loginWithFacebook(options?: Meteor.LoginWithExternalServiceOptions, callback?: Function): void;
    function loginWithGithub(options?: Meteor.LoginWithExternalServiceOptions, callback?: Function): void;
    function loginWithGoogle(options?: Meteor.LoginWithExternalServiceOptions, callback?: Function): void;
    function loginWithMeetup(options?: Meteor.LoginWithExternalServiceOptions, callback?: Function): void;
    function loginWithTwitter(options?: Meteor.LoginWithExternalServiceOptions, callback?: Function): void;
    function loginWithWeibo(options?: Meteor.LoginWithExternalServiceOptions, callback?: Function): void;

    interface SubscriptionHandle {
      stop(): void;
      ready(): boolean;
    }
  }
}

declare module "meteor/blaze" {
  export module Blaze {
    interface View {
      name: string;
      parentView: Blaze.View;
      isCreated: boolean;
      isRendered: boolean;
      isDestroyed: boolean;
      renderCount: number;
      autorun(runFunc: Function): void;
      onViewCreated(func: Function): void;
      onViewReady(func: Function): void;
      onViewDestroyed(func: Function): void;
      firstNode(): Node;
      lastNode(): Node;
      template: Blaze.Template;
      templateInstance(): any;
    }
    interface Template {
      viewName: string;
      renderFunction: Function;
      constructView(): Blaze.View;
    }
  }
}

declare module "meteor/browser-policy" {
  export module BrowserPolicy {

    interface framing {
      disallow(): void;
      restrictToOrigin(origin: string): void;
      allowAll(): void;
    }
    interface content {
      allowEval(): void;
      allowInlineStyles(): void;
      allowInlineScripts(): void;
      allowSameOriginForAll(): void;
      allowDataUrlForAll(): void;
      allowOriginForAll(origin: string): void;
      allowImageOrigin(origin: string): void;
      allowFrameOrigin(origin: string): void;
      allowContentTypeSniffing(): void;
      allowAllContentOrigin(): void;
      allowAllContentDataUrl(): void;
      allowAllContentSameOrigin(): void;

      disallowAll(): void;
      disallowInlineStyles(): void;
      disallowEval(): void;
      disallowInlineScripts(): void;
      disallowFont(): void;
      disallowObject(): void;
      disallowAllContent(): void;
      //TODO: add the basic content types
      // allow<content type>Origin(origin)
      // allow<content type>DataUrl()
      // allow<content type>SameOrigin()
      // disallow<content type>()
    }
  }
}


/**
 * These are the server modules and interfaces that can't be automatically generated from the Meteor data.js file
 */

declare module "meteor/meteor" {
  export module Meteor {
    interface EmailFields {
      subject?: Function;
      text?: Function;
    }

    interface EmailTemplates {
      from: string;
      siteName: string;
      resetPassword: Meteor.EmailFields;
      enrollAccount: Meteor.EmailFields;
      verifyEmail: Meteor.EmailFields;
    }

    interface Connection {
      id: string;
      close: Function;
      onClose: Function;
      clientAddress: string;
      httpHeaders: Object;
    }
  }
}

declare module "meteor/mongo" {
  export module Mongo {
    interface AllowDenyOptions {
      insert?: (userId: string, doc: any) => boolean;
      update?: (userId: string, doc: any, fieldNames: string[], modifier: any) => boolean;
      remove?: (userId: string, doc: any) => boolean;
      fetch?: string[];
      transform?: Function;
    }
  }
}

interface MailComposerOptions {
  escapeSMTP: boolean;
  encoding: string;
  charset: string;
  keepBcc: boolean;
  forceEmbeddedImages: boolean;
}

declare var MailComposer: MailComposerStatic;
interface MailComposerStatic {
  new (options: MailComposerOptions): MailComposer;
}
interface MailComposer {
  addHeader(name: string, value: string): void;
  setMessageOption(from: string, to: string, body: string, html: string): void;
  streamMessage(): void;
  pipe(stream: any /** fs.WriteStream **/): void;
}
/**
 * These are the modules and interfaces for packages that can't be automatically generated from the Meteor data.js file
 */

interface ILengthAble {
  length: number;
}

interface ITinytestAssertions {
  ok(doc: Object): void;
  expect_fail(): void;
  fail(doc: Object): void;
  runId(): string;
  equal<T>(actual: T, expected: T, message?: string, not?: boolean): void;
  notEqual<T>(actual: T, expected: T, message?: string): void;
  instanceOf(obj: Object, klass: Function, message?: string): void;
  notInstanceOf(obj: Object, klass: Function, message?: string): void;
  matches(actual: any, regexp: RegExp, message?: string): void;
  notMatches(actual: any, regexp: RegExp, message?: string): void;
  throws(f: Function, expected?: string | RegExp): void;
  isTrue(v: boolean, msg?: string): void;
  isFalse(v: boolean, msg?: string): void;
  isNull(v: any, msg?: string): void;
  isNotNull(v: any, msg?: string): void;
  isUndefined(v: any, msg?: string): void;
  isNotUndefined(v: any, msg?: string): void;
  isNan(v: any, msg?: string): void;
  isNotNan(v: any, msg?: string): void;
  include<T>(s: Array<T> | Object | string, value: any, msg?: string, not?: boolean): void;

  notInclude<T>(s: Array<T> | Object | string, value: any, msg?: string, not?: boolean): void;
  length(obj: ILengthAble, expected_length: number, msg?: string): void;
  _stringEqual(actual: string, expected: string, msg?: string): void;
}

declare module "meteor/tiny-test" {
  export module Tinytest {
    function add(description: string, func: (test: ITinytestAssertions) => void): void;
    function addAsync(description: string, func: (test: ITinytestAssertions) => void): void;
  }
}


// Kept in for backwards compatibility
declare module "meteor/meteor" {
  export module Meteor {
    interface Tinytest {
      add(description: string, func: (test: ITinytestAssertions) => void): void;
      addAsync(description: string, func: (test: ITinytestAssertions) => void): void;
    }
  }
}

declare module "meteor/accounts-base" {
  import { Meteor } from "meteor/meteor";

  export module Accounts {
    function addEmail(userId: string, newEmail: string, verified?: boolean): void;
    function changePassword(oldPassword: string, newPassword: string, callback?: Function): void;
    function createUser(options: {
      username?: string;
      email?: string;
      password?: string;
      profile?: Object;
    }, callback?: Function): string;
    var emailTemplates: Meteor.EmailTemplates;
    var _options: any;
    function createUserWithPhone(options: Object);
    function findUserByEmail(email: string): Object;
    function findUserByUsername(username: string): Object;
    function forgotPassword(options: {
      email?: string;
    }, callback?: Function): void;
    function onEmailVerificationLink(callback: Function): void;
    function onEnrollmentLink(callback: Function): void;
    function onResetPasswordLink(callback: Function): void;
    function removeEmail(userId: string, email: string): void;
    function resetPassword(token: string, newPassword: string, callback?: Function): void;
    function sendEnrollmentEmail(userId: string, email?: string): void;
    function sendResetPasswordEmail(userId: string, email?: string): void;
    function sendVerificationEmail(userId: string, email?: string): void;
    function setPassword(userId: string, newPassword: string, options?: {
      logout?: Object;
    }): void;
    function setUsername(userId: string, newUsername: string): void;
    var ui: {
      config(options: {
        requestPermissions?: Object;
        requestOfflineToken?: Object;
        forceApprovalPrompt?: Object;
        passwordSignupFields?: string;
      }): void;
    };
    function verifyEmail(token: string, callback?: Function): void;
    function config(options: {
      sendVerificationEmail?: boolean;
      forbidClientAccountCreation?: boolean;
      restrictCreationByEmailDomain?: string | Function;
      loginExpirationInDays?: number;
      oauthSecretKey?: string;
    }): void;
    function onLogin(func: Function): { stop: () => void };
    function onLoginFailure(func: Function): { stop: () => void };
    function user(): Meteor.User;
    function userId(): string;
    function loggingIn(): boolean;
    function logout(callback?: Function): void;
    function logoutOtherClients(callback?: Function): void;
    function onCreateUser(func: Function): void;
    function validateLoginAttempt(func: Function): { stop: () => void };
    function validateNewUser(func: Function): boolean;
  }
}

declare module App {
  function accessRule(domainRule: string, options?: {
    launchExternal?: boolean;
  }): void;
  function configurePlugin(id: string, config: Object): void;
  function icons(icons: Object): void;
  function info(options: {
    id?: string;
    version?: string;
    name?: string;
    description?: string;
    author?: string;
    email?: string;
    website?: string;
  }): void;
  function launchScreens(launchScreens: Object): void;
  function setPreference(name: string, value: string, platform?: string): void;
}

declare module Assets {
  function getBinary(assetPath: string, asyncCallback?: Function): EJSON;
  function getText(assetPath: string, asyncCallback?: Function): string;
}

declare module "meteor/blaze" {
  import { Meteor } from "meteor/meteor";
  export module Blaze {
    function Each(argFunc: Function, contentFunc: Function, elseFunc?: Function): Blaze.View;
    function If(conditionFunc: Function, contentFunc: Function, elseFunc?: Function): Blaze.View;
    function Let(bindings: Function, contentFunc: Function): Blaze.View;
    var Template: TemplateStatic;
    interface TemplateStatic {
      new (viewName?: string, renderFunction?: Function): Template;
      // It should be [templateName: string]: TemplateInstance but this is not possible -- user will need to cast to TemplateInstance
      [templateName: string]: any | Template; // added "any" to make it work
      head: Template;
      find(selector: string): Blaze.Template;
      findAll(selector: string): Blaze.Template[];
      $: any;
    }
    interface Template {
    }

    var TemplateInstance: TemplateInstanceStatic;
    interface TemplateInstanceStatic {
      new (view: Blaze.View): TemplateInstance;
    }
    interface TemplateInstance {
      $(selector: string): any;
      autorun(runFunc: Function): Object;
      data: Object;
      find(selector?: string): Blaze.TemplateInstance;
      findAll(selector: string): Blaze.TemplateInstance[];
      firstNode: Object;
      lastNode: Object;
      subscribe(name: string, ...args: any[]): Meteor.SubscriptionHandle;
      subscriptionsReady(): boolean;
      view: Object;
    }

    function Unless(conditionFunc: Function, contentFunc: Function, elseFunc?: Function): Blaze.View;
    var View: ViewStatic;
    interface ViewStatic {
      new (name?: string, renderFunction?: Function): View;
    }
    interface View {
    }

    function With(data: Object | Function, contentFunc: Function): Blaze.View;
    var currentView: Blaze.View;
    function getData(elementOrView?: HTMLElement | Blaze.View): Object;
    function getView(element?: HTMLElement): Blaze.View;
    function isTemplate(value: any): boolean;
    function remove(renderedView: Blaze.View): void;
    function render(templateOrView: Template | Blaze.View, parentNode: Node, nextNode?: Node, parentView?: Blaze.View): Blaze.View;
    function renderWithData(templateOrView: Template | Blaze.View, data: Object | Function, parentNode: Node, nextNode?: Node, parentView?: Blaze.View): Blaze.View;
    function toHTML(templateOrView: Template | Blaze.View): string;
    function toHTMLWithData(templateOrView: Template | Blaze.View, data: Object | Function): string;
  }
}

declare module Cordova {
  function depends(dependencies: { [id: string]: string }): void;
}

declare module "meteor/ddp" {
  export module DDP {
    function connect(url: string): DDP.DDPStatic;
  }
}

declare module DDPCommon {
  function MethodInvocation(options: {
  }): any;
}

declare module EJSON {
  var CustomType: CustomTypeStatic;
  interface CustomTypeStatic {
    new (): CustomType;
  }
  interface CustomType {
    clone(): EJSON.CustomType;
    equals(other: Object): boolean;
    toJSONValue(): JSONable;
    typeName(): string;
  }

  function addType(name: string, factory: (val: JSONable) => EJSON.CustomType): void;
  function clone<T>(val: T): T;
  function equals(a: EJSON, b: EJSON, options?: {
    keyOrderSensitive?: boolean;
  }): boolean;
  function fromJSONValue(val: JSONable): any;
  function isBinary(x: Object): boolean;
  var newBinary: any;
  function parse(str: string): EJSON;
  function stringify(val: EJSON, options?: {
    indent?: boolean | number | string;
    canonical?: boolean;
  }): string;
  function toJSONValue(val: EJSON): JSONable;
}

declare module Match {
  function test(value: any, pattern: any): boolean;
}

declare module "meteor/meteor" {
  import { Mongo } from "meteor/mongo";

  export module Meteor {
    var Error: ErrorStatic;
    interface ErrorStatic {
      new (error: string | number, reason?: string, details?: string): Error;
    }
    interface Error {
      error: string | number;
      reason?: string;
      details?: string;
    }
    function absoluteUrl(path?: string, options?: {
      secure?: boolean;
      replaceLocalhost?: boolean;
      rootUrl?: string;
    }): string;
    function apply(name: string, args: EJSONable[], options?: {
      wait?: boolean;
      onResultReceived?: Function;
    }, asyncCallback?: Function): any;
    function call(name: string, ...args: any[]): any;
    function clearInterval(id: number): void;
    function clearTimeout(id: number): void;
    function disconnect(): void;
    var isClient: boolean;
    var isCordova: boolean;
    var isServer: boolean;
    function loggingIn(): boolean;
    function loginWith<ExternalService>(options?: {
      requestPermissions?: string[];
      requestOfflineToken?: boolean;
      loginUrlParameters?: Object;
      userEmail?: string;
      loginStyle?: string;
      redirectUrl?: string;
    }, callback?: Function): void;
    function loginWithPassword(user: Object | string, password: string, callback?: Function): void;
    function logout(callback?: Function): void;
    function logoutOtherClients(callback?: Function): void;
    function methods(methods: Object): void;
    function onConnection(callback: Function): void;
    function publish(name: string, func: Function): void;
    function reconnect(): void;
    var release: string;
    function setInterval(func: Function, delay: number): number;
    function setTimeout(func: Function, delay: number): number;
    var settings: { [id: string]: any };
    function startup(func: Function): void;
    function status(): Meteor.StatusEnum;
    function subscribe(name: string, ...args: any[]): Meteor.SubscriptionHandle;
    function user(): Meteor.User;
    function userId(): string;
    var users: Mongo.Collection<User>;
    function wrapAsync(func: Function, context?: Object): any;
    function publishComposite(name: string, options: Object);
  }
}

declare module "meteor/mongo" {
  import { Meteor } from "meteor/meteor";

  export module Mongo {
    var Collection: CollectionStatic;
    interface CollectionStatic {
      new <T>(name: string, options?: {
        connection?: Object;
        idGeneration?: string;
        transform?: Function;
      }): Collection<T>;
    }
    interface Collection<T> {
      allow(options: {
        insert?: (userId: string, doc: T) => boolean;
        update?: (userId: string, doc: T, fieldNames: string[], modifier: any) => boolean;
        remove?: (userId: string, doc: T) => boolean;
        fetch?: string[];
        transform?: Function;
      }): boolean;
      deny(options: {
        insert?: (userId: string, doc: T) => boolean;
        update?: (userId: string, doc: T, fieldNames: string[], modifier: any) => boolean;
        remove?: (userId: string, doc: T) => boolean;
        fetch?: string[];
        transform?: Function;
      }): boolean;
      find(selector?: Mongo.Selector | Mongo.ObjectID | string, options?: {
        sort?: Mongo.SortSpecifier;
        skip?: number;
        limit?: number;
        fields?: Mongo.FieldSpecifier;
        reactive?: boolean;
        transform?: Function;
      }): Mongo.Cursor<T>;
      findOne(selector?: Mongo.Selector | Mongo.ObjectID | string, options?: {
        sort?: Mongo.SortSpecifier;
        skip?: number;
        fields?: Mongo.FieldSpecifier;
        reactive?: boolean;
        transform?: Function;
      }): T;
      insert(doc: T, callback?: Function): string;
      rawCollection(): any;
      rawDatabase(): any;
      remove(selector: Mongo.Selector | Mongo.ObjectID | string, callback?: Function): number;
      update(selector: Mongo.Selector | Mongo.ObjectID | string, modifier: Mongo.Modifier, options?: {
        multi?: boolean;
        upsert?: boolean;
      }, callback?: Function): number;
      upsert(selector: Mongo.Selector | Mongo.ObjectID | string, modifier: Mongo.Modifier, options?: {
        multi?: boolean;
      }, callback?: Function): { numberAffected?: number; insertedId?: string; };
      _ensureIndex(indexName: string, options?: { [key: string]: any }): void;
    }

    var Cursor: CursorStatic;
    interface CursorStatic {
      new <T>(): Cursor<T>;
    }
    interface Cursor<T> {
      count(): number;
      fetch(): Array<T>;
      forEach(callback: <T>(doc: T, index: number, cursor: Mongo.Cursor<T>) => void, thisArg?: any): void;
      map<U>(callback: (doc: T, index: number, cursor: Mongo.Cursor<T>) => U, thisArg?: any): Array<U>;
      observe(callbacks: Object): Meteor.LiveQueryHandle;
      observeChanges(callbacks: Object): Meteor.LiveQueryHandle;
    }

    var ObjectID: ObjectIDStatic;
    interface ObjectIDStatic {
      new (hexString?: string): ObjectID;
    }
    interface ObjectID {
    }

  }
}

declare module Npm {
  function depends(dependencies: { [id: string]: string }): void;
  function require(name: string): any;
}

declare module Package {
  function describe(options: {
    summary?: string;
    version?: string;
    name?: string;
    git?: string;
    documentation?: string;
    debugOnly?: boolean;
    prodOnly?: boolean;
  }): void;
  function onTest(func: Function): void;
  function onUse(func: Function): void;
  function registerBuildPlugin(options?: {
    name?: string;
    use?: string | string[];
    sources?: string[];
    npmDependencies?: Object;
  }): void;
}

declare module "meteor/tracker" {
  export module Tracker {
    function Computation(): void;
    interface Computation {
      firstRun: boolean;
      invalidate(): void;
      invalidated: boolean;
      onInvalidate(callback: Function): void;
      onStop(callback: Function): void;
      stop(): void;
      stopped: boolean;
    }

    var Dependency: DependencyStatic;
    interface DependencyStatic {
      new (): Dependency;
    }
    interface Dependency {
      changed(): void;
      depend(fromComputation?: Tracker.Computation): boolean;
      hasDependents(): boolean;
    }

    var active: boolean;
    function afterFlush(callback: Function): void;
    function autorun(runFunc: (computation: Tracker.Computation) => void, options?: {
      onError?: Function;
    }): Tracker.Computation;
    var currentComputation: Tracker.Computation;
    function flush(): void;
    function nonreactive(func: Function): void;
    function onInvalidate(callback: Function): void;
  }
}

declare module Session {
  function equals(key: string, value: string | number | boolean | any /** Null **/ | any /** Undefined **/): boolean;
  function get(key: string): any;
  function set(key: string, value: EJSONable | any /** Undefined **/): void;
  function setDefault(key: string, value: EJSONable | any /** Undefined **/): void;
}

declare module "meteor/http" {
  import { Meteor } from "meteor/meteor";
  export module HTTP {

    function call(method: string, url: string, options?: {
      content?: string;
      data?: Object;
      query?: string;
      params?: Object;
      auth?: string;
      headers?: Object;
      timeout?: number;
      followRedirects?: boolean;
      npmRequestOptions?: Object;
      beforeSend?: Function;
    }, asyncCallback?: Function): HTTP.HTTPResponse;
    function del(url: string, callOptions?: Object, asyncCallback?: Function): HTTP.HTTPResponse;
    function get(url: string, callOptions?: Object, asyncCallback?: Function): HTTP.HTTPResponse;
    function post(url: string, callOptions?: Object, asyncCallback?: Function): HTTP.HTTPResponse;
    function put(url: string, callOptions?: Object, asyncCallback?: Function): HTTP.HTTPResponse;
  }
}

declare module "meteor/email" {
  export module Email {
    function send(options: {
      from?: string;
      to?: string | string[];
      cc?: string | string[];
      bcc?: string | string[];
      replyTo?: string | string[];
      subject?: string;
      text?: string;
      html?: string;
      headers?: Object;
      attachments?: Object[];
      mailComposer?: MailComposer;
    }): void;
  }
}

declare var CompileStep: CompileStepStatic;
interface CompileStepStatic {
  new (): CompileStep;
}
interface CompileStep {
  addAsset(options: {
  }, path: string, data: any /** Buffer **/ | string): any;
  addHtml(options: {
    section?: string;
    data?: string;
  }): any;
  addJavaScript(options: {
    path?: string;
    data?: string;
    sourcePath?: string;
  }): any;
  addStylesheet(options: {
  }, path: string, data: string, sourceMap: string): any;
  arch: any;
  declaredExports: any;
  error(options: {
  }, message: string, sourcePath?: string, line?: number, func?: string): any;
  fileOptions: any;
  fullInputPath: any;
  inputPath: any;
  inputSize: any;
  packageName: any;
  pathForSourceMap: any;
  read(n?: number): any;
  rootOutputPath: any;
}

declare var PackageAPI: PackageAPIStatic;
interface PackageAPIStatic {
  new (): PackageAPI;
}
interface PackageAPI {
  addAssets(filenames: string | string[], architecture: string | string[]): void;
  addFiles(filenames: string | string[], architecture?: string | string[], options?: {
    bare?: boolean;
  }): void;
  export(exportedObjects: string | string[], architecture?: string | string[], exportOptions?: Object, testOnly?: boolean): void;
  imply(packageNames: string | string[], architecture?: string | string[]): void;
  use(packageNames: string | string[], architecture?: string | string[], options?: {
    weak?: boolean;
    unordered?: boolean;
  }): void;
  versionsFrom(meteorRelease: string | string[]): void;
}

declare module "meteor/reactive-var" {
  import { Meteor } from "meteor/meteor";

  export var ReactiveVar: ReactiveVarStatic;
  interface ReactiveVarStatic {
    new <T>(initialValue: T, equalsFunc?: Function): ReactiveVar<T>;
  }
  interface ReactiveVar<T> {
    get(): T;
    set(newValue: T): void;
  }

  export var Subscription: SubscriptionStatic;
  interface SubscriptionStatic {
    new (): Subscription;
  }
  interface Subscription {
    added(collection: string, id: string, fields: Object): void;
    changed(collection: string, id: string, fields: Object): void;
    connection: Meteor.Connection;
    error(error: Error): void;
    onStop(func: Function): void;
    ready(): void;
    removed(collection: string, id: string): void;
    stop(): void;
    userId: string;
  }
}

declare module "meteor/blaze" {
  import { Meteor } from "meteor/meteor";

  export var Template: TemplateStatic;
  interface TemplateStatic {
    new (): Template;
    // It should be [templateName: string]: TemplateInstance but this is not possible -- user will need to cast to TemplateInstance
    [templateName: string]: any | Template; // added "any" to make it work
    head: Template;
    find(selector: string): Blaze.Template;
    findAll(selector: string): Blaze.Template[];
    $: any;
    body: Template;
    currentData(): {};
    instance(): Blaze.TemplateInstance;
    parentData(numLevels?: number): {};
    registerHelper(name: string, helperFunction: Function): void;
  }
  interface Template {
    created: Function;
    destroyed: Function;
    events(eventMap: Meteor.EventMap): void;
    helpers(helpers: { [id: string]: any }): void;
    onCreated: Function;
    onDestroyed: Function;
    onRendered: Function;
    rendered: Function;
  }
}

declare function check(value: any, pattern: any): void;
declare function execFileAsync(command: string, args?: any[], options?: {
  cwd?: Object;
  env?: Object;
  stdio?: any[] | string;
  destination?: any;
  waitForClose?: string;
}): any;
declare function execFileSync(command: string, args?: any[], options?: {
  cwd?: Object;
  env?: Object;
  stdio?: any[] | string;
  destination?: any;
  waitForClose?: string;
}): String;
declare function getExtension(): String;

vim ctags支持javascript, typescript, coffeescript语法

vi $HOME/.ctags,添加如下代码: --regex-JavaScript=/(^|^[^\/*]+[[:blank:]])([A-Za-z0-9._$]+)[[:blank:]]*[:=][[:blank:]]*new[[:blank:]]+Object\(/\2...

阅读全文

javascript ES6语法糖:函数…省略号参数

1. 语法 function(a, b, ...theArgs) { // ... } 如果一个函数的最后一个形参是以 … 为前缀的,则在函数被调用时,该形参会成为一个数组,数组中...

阅读全文

欢迎留言