在我的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错误呢?
答案 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的其他路径映射)。