typescript 在类中使用方法时需要`this '参数

8iwquhpp  于 2023-03-04  发布在  TypeScript
关注(0)|答案(1)|浏览(146)

不知道为什么,但是为什么我必须在这个函数中使用this参数:

export class UsersModel extends Model {
  getUser(this: UsersModel, name: string) {
    return this.where('first', '_ilike', `${name}%`).order('last', 'asc');
  }
}

如果我不使用它,我会得到一个错误:
类型为“${string}%”的参数不能赋值给类型为“this[“fields”][“first”] extends Model?Fields〈this[“fields”][“first”]〉“的参数:此[“字段”][“第一个”]“。
Playground

7cwmlq89

7cwmlq891#

使用任意this(扩展UsersModel),TypeScript无法推断Fields<this>[K]的具体类型。它可能是string,但也可能更具体。请考虑

class BadUsersModel extends UsersModel {
  fields = { first: "other" as const }
}

const bum = new BadUsersModel;
bum.getUser("…");

这里是否允许调用getUser?不允许,因为where方法的类型将被限制为where<"first">(field: "first", key: "_ilike", value: "other"): this,并且"…%"(或通常为string)不能赋值给"other"
因此,您需要告诉TypeScript,您希望仅在fields.first类型恰好为stringUsersModel示例上调用getUser。(诚然,在声明getUser(this: UsersModel, …)之后,TypeScript无法调用bum.getUser("…"),它忘记了字段类型可以用在逆变位置中,并且只检查x1M16N1x可以被分配给x1M17N1x)。

相关问题