Dexie Real Class 使用 TypeScript 3:Put/Add 使用未定义的 ID 不工作

Dexie Real Class With TypeScript 3: Put/Add With undefined id Not Working

首先,docs中的“真实class”示例无法编译:

export class Contact implements IContact {
  id: number;
  first: string;
  last: string;
  emails: IEmailAddress[];
  phones: IPhoneNumber[];
  
  constructor(first: string, last: string, id?:number) {
    this.first = first;
    this.last = last;
    if (id) this.id = id;
  }

编译器抱怨没有在构造函数中设置 id。保留使 id undefined/id? 的选项。 但是对于未定义的 id,Table.put()/add() 会抛出一个错误:Unhandled Rejection (DataError): Data provided to an operation does not meet requirements.

我的示例代码:

export class DBProgram {
    id?: number
    name: string
    description: string

    constructor(name: string, description: string, id?:number) {
        this.name = name
        this.description = description
        // if(id) this.id = id
    }
    save() {
        return idb.transaction('rw', idb.dbPrograms, async () => {
            // delete this.id
            this.id = await idb.dbPrograms.add(this);
        });
    }
}

export class Idb extends Dexie {

    dbPrograms: Table<DBProgram, number>

    constructor () {
        super("Idb")
        this.version(1).stores({
            dbPrograms: '++id, name, description, commands',
        })
        this.dbPrograms = this.table('dbPrograms')
        this.dbPrograms.mapToClass(DBProgram)
    }
}

export const idb = new Idb()

当我取消注释 delete this.id 时,它会运行并存储具有自动 ID 的对象。但似乎 Dexie 不会处理 undefined id.

有什么提示吗?

不幸的是,它在 codesandbox 中有效:https://codesandbox.io/s/determined-lake-ntbzv?fontsize=14&hidenavigation=1&theme=dark

我不知道我的源代码与 codesandbox 相比还有什么问题。也许是版本问题?不过 Dexie 版本是一样的。

此问题是关于自编写 Dexie 示例以来打字稿的差异。将 id 属性 声明为可选的或使用感叹号绕过。我会尝试更新文档。

运行时错误是由于 ecmascript class 字段提案设置为处理 class 字段的方式。这也是新的,但已经在 chrome 中实现,当 typescript 转换为 esnext 时,它会让 class 字段保留。下一个版本的 Dexie 中的 PR 中存在解决此问题的方法。虽然它还没有出来。修复可能会进入版本 3.0.4。我会在这个 Whosebug 问题可用时发表评论。