Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

"No overload matches this call" when passing the store name as a variable #319

Open
retorquere opened this issue Jul 5, 2024 · 0 comments

Comments

@retorquere
Copy link

with the code below, I get

index.ts:93:30 - error TS2769: No overload matches this call.
  Overload 1 of 2, '(storeNames: "ZoteroSerialized" | "ZoteroSerializedTouched" | "ExportCacheContext" | "BetterBibLaTeX" | "BetterBibTeX" | "BetterCSLJSON" | "BetterCSLYAML" | "metadata", mode?: "readwrite" | undefined, options?: IDBTransactionOptions | undefined): IDBPTransaction<...>', gave the following error.
    Argument of type 'string' is not assignable to parameter of type '"ZoteroSerialized" | "ZoteroSerializedTouched" | "ExportCacheContext" | "BetterBibLaTeX" | "BetterBibTeX" | "BetterCSLJSON" | "BetterCSLYAML" | "metadata"'.
  Overload 2 of 2, '(storeNames: ArrayLike<"ZoteroSerialized" | "ZoteroSerializedTouched" | "ExportCacheContext" | "BetterBibLaTeX" | "BetterBibTeX" | "BetterCSLJSON" | "BetterCSLYAML" | "metadata">, mode?: "readwrite" | undefined, options?: IDBTransactionOptions | undefined): IDBPTransaction<...>', gave the following error.
    Argument of type 'string' is not assignable to parameter of type 'ArrayLike<"ZoteroSerialized" | "ZoteroSerializedTouched" | "ExportCacheContext" | "BetterBibLaTeX" | "BetterBibTeX" | "BetterCSLJSON" | "BetterCSLYAML" | "metadata">'.

93   const tx = $db.transaction(name, 'readwrite')
                                ~~~~


index.ts:94:32 - error TS2345: Argument of type 'string' is not assignable to parameter of type '"ZoteroSerialized" | "ZoteroSerializedTouched" | "ExportCacheContext" | "BetterBibLaTeX" | "BetterBibTeX" | "BetterCSLJSON" | "BetterCSLYAML" | "metadata"'.

94   const store = tx.objectStore(name)
                                  ~~~~

index.ts:95:29 - error TS2345: Argument of type 'string' is not assignable to parameter of type 'never'.

95   const index = store.index('itemID')

if I replace name with the constant 'BetterBibTeX' the error goes away

code -- click to show
import { openDB, IDBPDatabase, DBSchema } from 'idb'

export type ExportContext = {
  context: string
  id: number
}

export type ExportCacheContent = {
  context: number
  itemID: number
  entry: string
}

type Serialized = {
  itemID: number
  title: string
}

interface Schema extends DBSchema {
  ZoteroSerialized: {
    value: Serialized
    key: number
  }
  ZoteroSerializedTouched: {
    value: boolean
    key: number
  }

  ExportCacheContext: {
    value: ExportContext
    key: number
    indexes: { context: string }
  }

  BetterBibLaTeX: {
    value: ExportCacheContent
    key: [number, number]
    indexes: { context: number, itemID: number, 'context-itemID': [ number, number ] }
  }
  BetterBibTeX: {
    value: ExportCacheContent
    key: [number, number]
    indexes: { context: number, itemID: number, 'context-itemID': [ number, number ] }
  }
  BetterCSLJSON: {
    value: ExportCacheContent
    key: [number, number]
    indexes: { context: number, itemID: number, 'context-itemID': [ number, number ] }
  }
  BetterCSLYAML: {
    value: ExportCacheContent
    key: [number, number]
    indexes: { context: number, itemID: number, 'context-itemID': [ number, number ] }
  }

  metadata: {
    value: { key: string, value: string | number }
    key: string
  }
}

async function main() {
  const $db = await openDB<Schema>('BetterBibTeXCache', 1, {
    upgrade: (db, oldVersion, newVersion) => {
      if (oldVersion !== newVersion) {
        for (const store of db.objectStoreNames) {
          db.deleteObjectStore(store)
        }
      }

      db.createObjectStore('ZoteroSerialized', { keyPath: 'itemID' })
      db.createObjectStore('ZoteroSerializedTouched')
      db.createObjectStore('metadata')

      const context = db.createObjectStore('ExportCacheContext', { keyPath: 'id', autoIncrement: true })
      context.createIndex('context', 'context', { unique: true })

      const stores = [
        db.createObjectStore('BetterBibTeX', { keyPath: [ 'context', 'itemID' ] }),
        db.createObjectStore('BetterBibLaTeX', { keyPath: [ 'context', 'itemID' ] }),
        db.createObjectStore('BetterCSLJSON', { keyPath: [ 'context', 'itemID' ] }),
        db.createObjectStore('BetterCSLYAML', { keyPath: [ 'context', 'itemID' ] }),
      ]
      for (const store of stores) {
        store.createIndex('context', 'context')
        store.createIndex('itemID', 'itemID')
        store.createIndex('context-itemID', [ 'context', 'itemID' ], { unique: true })
      }
    },
  })

  const name: keyof Schema = 'BetterBibTeX'
  const tx = $db.transaction(name, 'readwrite')
  const store = tx.objectStore(name)
  
  const index = store.index('itemID')
  const ids = [1, 2, 3]
  for (const id of ids) {
    let cursor = await index.openCursor(IDBKeyRange.only(id))
    while (cursor) {
      await store.delete(cursor.primaryKey)
      cursor = await cursor.continue()
    }
  }
  await tx.done
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant