我正在使用Ionic 3开发应用程序,发现无法使用Ionic native SQLite,因为测试时(ionic serve --lab
)SQLite在Web浏览器中不可用。
因此,我想使用Ionic Native Mocks SQLite以便可以在Web浏览器中进行测试。模拟插件的说明说,有两种安装模拟插件的方法,即npm或手动添加到项目,因此我选择了第一种方法。
我通过npm安装了离子本机插件和离子本机模拟SQLite,将SQLite添加到app.module.ts,将SQLite注入了我的服务。
import { SQLite } from '@ionic-native/sqlite';
import { SQLiteMock } from '@ionic-native-mocks/sqlite';
...
providers: [
...
{ provide: SQLite, useClass: SQLiteMock },
AppDbProvider
]
然后尝试了ionic serve --lab
,但出现错误。
错误:未捕获(承诺):TypeError:无法读取未定义的属性“ executeSql” TypeError:无法读取未定义的属性'executeSql'
当我试图做这样的事情时。
@Injectable()
export class AppDbProvider {
constructor(private sqlite: SQLite) {
// create semester table sql
const createSemester = 'create table if not exists ...';
this.sqlite.create({
name: 'data.db',
location: 'default'
}).then(db => {
db.executeSql(createSemester, {});
});
}
}
我不知道为什么SQLiteObject
未定义,所以我检查了mock plugin source,发现SQLiteObject的定义类似于export declare class SQLiteObject
,每个方法都没有实现。 SQLiteMock.create
的定义也是如此。
create(config: SQLiteDatabaseConfig): Promise<SQLiteObject> {
let theResult: SQLiteObject;
return new Promise((resolve, reject) => {
resolve(theResult);
});
};
很明显,为什么SQLiteObject
未定义,但我不明白的是,为什么SQLiteObject
是使用declare
关键字定义的(我会弄清楚是否不是打字稿新手。 )。
我认为我可以使它工作的方法是复制源代码,并通过删除SQLiteObject
关键字并实现declare
方法来修改executeSql
,但是为什么作者如此编写并制作它即使无法使用,也可以在npm上使用?
我认为作者希望客户端代码能够实现模拟,但问题是
如何实施export declare class
?