在我的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错误呢?
1条答案
按热度按时间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
中包含此文件:这使得模型的所有字符串查找都“工作”,只需将类型设置为
any
。如果你想真正 * 定义 * 类型,你需要创建一个
user.d.ts
文件,它位于user.js
文件的旁边,它导出模型类型 * 和 *,其中包括:如果你已经在使用
ember generate ember-cli-typescript
,那么运行它会自动更新这些内容。你也可以手动创建包含这些内容的文件,并设置paths
Map(你也可以添加来自the default blueprint的其他路径Map)。