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 错误呢?
要了解发生了什么,我建议阅读ember-cli-typescript 文档的这一部分。要点是,为 Ember 提供的类型做了一些额外的工作,以便当您输入 时this.findRecord(\'person\', 1),您返回的是 a Person(例如DS.Model您定义的)。为了实现这一点,类型定义了字符串名称和要返回的类型之间的“registry”\xe2\x80\x94a 映射。“注册表”为空是您在类型中看到的问题。
ember-cli-typescript 的默认配置使此“正常工作”,通过将密钥设置paths为tsconfig.json包含"*": "types/*"并包含此文件<your app directory>/types/ember-data/types/registries/model.d.ts:
/**\n * Catch-all for ember-data.\n */\nexport default interface ModelRegistry {\n [key: string]: any;\n}\nRun Code Online (Sandbox Code Playgroud)\n\n只需将类型设置为 ,就可以使模型的所有字符串查找“工作” any。
如果您想实际定义类型,您需要创建一个位于导出模型类型user.d.ts旁边的文件,其中包括:user.js
declare module \'ember-data/types/registries/model\' {\n export default interface ModelRegistry {\n \'user\': User;\n }\n}\nRun Code Online (Sandbox Code Playgroud)\n\nember generate ember-cli-typescript如果您已经在使用它,运行它将为您更新这些内容。您还可以使用这些内容手动创建该文件并设置映射paths(您可能还想添加默认蓝图中的其他路径映射)。
| 归档时间: |
|
| 查看次数: |
630 次 |
| 最近记录: |