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

bar*_*occ 3 ember.js ember-data typescript

在我的 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');
  }

}
Run Code Online (Sandbox Code Playgroud)

使用此代码,我收到以下 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');
                                ~~~~~~
Run Code Online (Sandbox Code Playgroud)

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]>;
Run Code Online (Sandbox Code Playgroud)

这就是我在调查如何定义时可以走多远的地方findAll

理论上this.store.findAll('user');是有效的,但是我应该怎么做才能修复这个 Typescript 错误呢?

Chr*_*cho 5

要了解发生了什么,我建议阅读ember-cli-typescript 文档的这一部分。要点是,为 Ember 提供的类型做了一些额外的工作,以便当您输入 时this.findRecord(\'person\', 1),您返回的是 a Person(例如DS.Model您定义的)。为了实现这一点,类型定义了字符串名称和要返回的类型之间的“registry”\xe2\x80\x94a 映射。“注册表”为空是您在类型中看到的问题。

\n\n

ember-cli-typescript 的默认配置使此“正常工作”,通过将密钥设置pathstsconfig.json包含"*": "types/*"并包含此文件<your app directory>/types/ember-data/types/registries/model.d.ts

\n\n
/**\n * Catch-all for ember-data.\n */\nexport default interface ModelRegistry {\n  [key: string]: any;\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

只需将类型设置为 ,就可以使模型的所有字符串查找“工作” any

\n\n

如果您想实际定义类型,您需要创建一个位于导出模型类型user.d.ts旁边的文件其中包括:user.js

\n\n
declare module \'ember-data/types/registries/model\' {\n  export default interface ModelRegistry {\n    \'user\': User;\n  }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

ember generate ember-cli-typescript如果您已经在使用它,运行它将为您更新这些内容。您还可以使用这些内容手动创建该文件并设置映射paths(您可能还想添加默认蓝图中的其他路径映射)。

\n