使用this.store.findRecod时如何修复类型检查

时间:2019-09-17 16:15:34

标签: typescript ember.js ember-data

在我的ember.js项目中,我使用Typescript和checkJs选项键入检查javascript文件。

这是一个简单的route.js文件示例

import Route from '@ember/routing/route';

export default class UsersRoute extends Route {
  model() {
    return this.store.findAll('user');
  }

}

使用此代码,出现以下Typescript错误

route.js:5:31 - error TS2345: Argument of type '"user"' is not assignable to parameter of type 'never'.

5     return this.store.findAll('user');
                                ~~~~~~

ember数据类型定义由@ types / ember-data包提供,这里是findAll definition

findAll<K extends keyof ModelRegistry>(
    modelName: K,
    options?: {
        reload?: boolean;
        backgroundReload?: boolean;
        include?: string;
        adapterOptions?: any;
    }
): PromiseArray<ModelRegistry[K]>;

这是我研究findAll的定义时可以走的距离。

从理论上讲,this.store.findAll('user');是有效的,但是该如何解决此Typescript错误呢?

1 个答案:

答案 0 :(得分:2)

要了解正在发生的事情,我建议阅读this section of the ember-cli-typescript docs。要点是,为Ember提供的类型需要做一些额外的工作,以便在键入this.findRecord('person', 1)时,返回的内容是Person(例如,您已经拥有的DS.Model定义)。为此,类型定义了一个“注册表”,即字符串名称和要返回的类型之间的映射。您在类型中看到的问题是“注册表”为空。

使用ember-cli-typescript的默认配置通过设置paths中的tsconfig.json键以包含"*": "types/*"并将此文件包含在{{1 }}:

<your app directory>/types/ember-data/types/registries/model.d.ts

仅通过将类型设为/** * Catch-all for ember-data. */ export default interface ModelRegistry { [key: string]: any; } ,就可以使模型的所有字符串查找“工作”。

如果您想真正地定义类型,则需要创建一个any旁边的user.d.ts文件,该文件将导出模型类型包括以下内容:

user.js

运行declare module 'ember-data/types/registries/model' { export default interface ModelRegistry { 'user': User; } } (如果已在使用)将为您更新这些内容。您还可以使用这些内容手动创建该文件并设置ember generate ember-cli-typescript映射(并且您可能还希望添加来自the default blueprint的其他路径映射)。