流星 1.10.2 打字稿 ValidatedMethod - this.userId

meteor 1.10.2 typescript ValidatedMethod - this.userId

我正在与 meteor typescript 和 mdg:ValidatedMethod 作斗争。

我将 This Repo 中的 @types 用于 mdg:ValidatedMethod

让我们假设这个没有 ValidateMethod 的流星代码:

const addLink = Meteor.methods({
  'links.add'({ title,url }) {
    new SimpleSchema({
      title: { type: String },
      url: {type: String}
    }).validate({ title,url });


    if (!this.userId) {
      //throw an error!
    }

    LinksCollection.insert({
      title,
      url,
      createdAt: new Date(),
    });
  }
});

这里一切正常,在 if (this.userId) {

上没有错误

但是,当我现在更改为 ValidatedMethod 时,typescript 找不到 this.userId

const addLink = new ValidatedMethod({
  name: 'links.add',
  validate: new SimpleSchema({
      title: { type: String },
      url: {type: String}
    }).validator(),
    run({title,url}) {
      if (!this.userId) { //Here typescript can't find this.userId
        //throw an error!
      }
  
      LinksCollection.insert({
        title,
        url,
        createdAt: new Date(),
      });
    }
});

我检查了第一个示例中的类型,并在@type-definition 中添加了 this-ref 运行 方法,这意味着我将第 17 行从

更改为

run: (args: { [key: string]: any; }) => void;

run: (this: Meteor.MethodThisType, args: { [key: string]: any; }) => void;

我现在似乎在工作,但是由于我对打字稿世界还很陌生,我想知道,这是否是正确的做法?!

TypeScript 让您可以像这样定义 this 的类型:

function f(this: ThisType) {}

查看此处了解更多信息:https://www.typescriptlang.org/docs/handbook/functions.html

在这种特定情况下,您可以添加

this: Meteor.MethodThisType

到 index.d.ts 中的 run 方法签名:

run: (this: Meteor.MethodThisType, args: { [key: string]: any; }) => void;

它并不完全完整,因为 ValidatedMethod 定义了几个额外的参数(例如 this.name),但您可以根据需要添加它们。