ember.js 如何修复使用此.store.findRecod时的类型检查

k10s72fa  于 2022-11-05  发布在  其他
关注(0)|答案(1)|浏览(161)

在我的ember.js项目中,我使用Typescript和checkJs选项键入check 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-data类型定义由@types/ember-data包提供,下面是findAll的定义

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错误呢?

ttvkxqim

ttvkxqim1#

要了解发生了什么,我建议阅读ember-cli-typescript文档的这一部分。要点是为Ember提供的类型做了一些额外的工作,以便当您键入this.findRecord('person', 1)时,返回的是Person(例如您定义的DS.Model)。要使其正常工作,这些类型定义了一个“注册表”--字符串名称和要返回的类型之间的Map。
ember-cli-typescript的默认配置使其“正常工作”,方法是在tsconfig.json中设置paths键以包含"*": "types/*",并在<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,那么运行它会自动更新这些内容。你也可以手动创建包含这些内容的文件,并设置pathsMap(你也可以添加来自the default blueprint的其他路径Map)。

相关问题