Skip to content

Commit fece76e

Browse files
committed
fix(types): infer type from target
1 parent 3a27304 commit fece76e

File tree

5 files changed

+45
-12
lines changed

5 files changed

+45
-12
lines changed

Diff for: src/database/bind.ts

+3-2
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,8 @@ import type { Query, DatabaseReference, DataSnapshot } from 'firebase/database'
2525
* Global option type when binding one database reference
2626
* @internal
2727
*/
28-
export interface _DatabaseRefOptions extends _DataSourceOptions {
28+
export interface _DatabaseRefOptions<DataT = unknown>
29+
extends _DataSourceOptions<DataT> {
2930
/**
3031
* Function to transform snapshots into data. **Make sure to reuse the original serializer to add the object `id`**.
3132
* See https://vuefire.vuejs.org/guide/global-options.html
@@ -37,7 +38,7 @@ export interface _DatabaseRefOptions extends _DataSourceOptions {
3738
* Global defaults type override options for all database bindings. This type remove make some optional values required.
3839
* @internal
3940
*/
40-
interface _DatabaseRefOptionsWithDefaults extends _DatabaseRefOptions {
41+
interface _DatabaseRefOptionsWithDefaults extends _DatabaseRefOptions<unknown> {
4142
/**
4243
* @defaultValue `false`
4344
*/

Diff for: src/database/index.ts

+4-5
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import { Ref, ref, MaybeRefOrGetter } from 'vue-demi'
22
import { DatabaseReference, getDatabase, Query } from 'firebase/database'
33
import { _Nullable, _RefWithState } from '../shared'
4-
import { _DatabaseRefOptions } from './bind'
54
import {
65
VueDatabaseDocumentData,
76
VueDatabaseQueryData,
@@ -13,7 +12,7 @@ import { UseDatabaseRefOptions, _useDatabaseRef } from './useDatabaseRef'
1312
export { globalDatabaseOptions } from './bind'
1413
export type { UseDatabaseRefOptions }
1514

16-
export type UseListOptions = UseDatabaseRefOptions
15+
export type UseListOptions<DataT = unknown> = UseDatabaseRefOptions<DataT>
1716

1817
/**
1918
* Creates a reactive variable connected to the database as an array. Each element in the array will contain an `id`
@@ -25,7 +24,7 @@ export type UseListOptions = UseDatabaseRefOptions
2524
*/
2625
export function useDatabaseList<T = unknown>(
2726
reference: MaybeRefOrGetter<_Nullable<DatabaseReference | Query>>,
28-
options?: UseListOptions
27+
options?: UseListOptions<T>
2928
): _RefDatabase<VueDatabaseQueryData<T>> {
3029
const data = ref<T[]>([]) as Ref<T[]>
3130
return _useDatabaseRef(
@@ -43,7 +42,7 @@ export function useDatabaseList<T = unknown>(
4342
*/
4443
export const useList = useDatabaseList
4544

46-
export type UseObjectOptions = UseDatabaseRefOptions
45+
export type UseObjectOptions<DataT = unknown> = UseDatabaseRefOptions<DataT>
4746

4847
/**
4948
* Creates a reactive variable connected to the database as an object. If the reference is a primitive, it will be
@@ -55,7 +54,7 @@ export type UseObjectOptions = UseDatabaseRefOptions
5554
*/
5655
export function useDatabaseObject<T = unknown>(
5756
reference: MaybeRefOrGetter<_Nullable<DatabaseReference>>,
58-
options?: UseObjectOptions
57+
options?: UseObjectOptions<T>
5958
): _RefDatabase<VueDatabaseDocumentData<T> | undefined> {
6059
const data = ref<T | null>()
6160
return _useDatabaseRef(reference, {

Diff for: src/database/useDatabaseRef.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,8 @@ import { _RefDatabase } from './utils'
3535
/**
3636
* Options when calling `useDatabaseList()` and `useDatabaseObject()`.
3737
*/
38-
export interface UseDatabaseRefOptions extends _DatabaseRefOptions {}
38+
export interface UseDatabaseRefOptions<DataT = unknown>
39+
extends _DatabaseRefOptions<DataT> {}
3940

4041
export function _useDatabaseRef(
4142
reference: MaybeRefOrGetter<_Nullable<DatabaseReference | Query>>,

Diff for: tests/database/list.spec.ts

+20-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { mount } from '@vue/test-utils'
2-
import { describe, expect, it } from 'vitest'
2+
import { describe, expect, it, expectTypeOf } from 'vitest'
33
import {
44
UseDatabaseRefOptions,
55
useDatabaseList,
@@ -34,7 +34,7 @@ describe('Database lists', () => {
3434
options,
3535
ref = databaseRef(),
3636
}: {
37-
options?: UseDatabaseRefOptions
37+
options?: UseDatabaseRefOptions<T>
3838
ref?: MaybeRefOrGetter<DatabaseReference | Query>
3939
} = {}) {
4040
let data!: _RefDatabase<VueDatabaseQueryData<T>>
@@ -403,6 +403,24 @@ describe('Database lists', () => {
403403
useDatabaseList<number>(databaseRef(db, 'todos'))
404404
)
405405

406+
expectTypeOf(useDatabaseList(databaseRef(db, 'todos'))).not.toMatchTypeOf<
407+
Ref<VueDatabaseQueryData<{ name: string }>>
408+
>()
409+
410+
expectTypeOf(useDatabaseList(databaseRef(db, 'todos'))).toMatchTypeOf<
411+
Ref<VueDatabaseQueryData<unknown>>
412+
>()
413+
414+
expectTypeOf(
415+
useDatabaseList<{ name: string }>(databaseRef(db, 'todos'))
416+
).toMatchTypeOf<Ref<VueDatabaseQueryData<{ name: string }>>>()
417+
418+
expectTypeOf(
419+
useDatabaseList(databaseRef(db, 'todos'), {
420+
target: ref<{ name: string }>({ name: 'a' }),
421+
})
422+
).toMatchTypeOf<Ref<VueDatabaseQueryData<{ name: string }>>>()
423+
406424
// TODO: tests for id field
407425
})
408426
})

Diff for: tests/database/objects.spec.ts

+16-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { mount } from '@vue/test-utils'
2-
import { beforeEach, describe, expect, it } from 'vitest'
2+
import { beforeEach, describe, expect, expectTypeOf, it } from 'vitest'
33
import {
44
UseDatabaseRefOptions,
55
useDatabaseObject,
@@ -37,7 +37,7 @@ describe('Database objects', () => {
3737
options,
3838
ref = databaseRef(),
3939
}: {
40-
options?: UseDatabaseRefOptions
40+
options?: UseDatabaseRefOptions<T>
4141
ref?: MaybeRefOrGetter<DatabaseReference>
4242
} = {}) {
4343
let data!: _RefDatabase<VueDatabaseDocumentData<T> | undefined>
@@ -299,5 +299,19 @@ describe('Database objects', () => {
299299
expectType<Ref<number | null | undefined>>(
300300
useDatabaseObject<number>(databaseRef(db, 'todo'))
301301
)
302+
303+
expectTypeOf(useDatabaseObject(databaseRef(db, 'oh'))).toMatchTypeOf<
304+
Ref<unknown>
305+
>()
306+
307+
expectTypeOf(
308+
useDatabaseObject<{ name: string }>(databaseRef(db, 'todo'))
309+
).toMatchTypeOf<Ref<_Nullable<{ name: string }>>>()
310+
311+
expectTypeOf(
312+
useDatabaseObject(databaseRef(db, 'todo'), {
313+
target: ref<{ name: string }>({ name: 'a' }),
314+
})
315+
).toMatchTypeOf<Ref<_Nullable<{ name: string }>>>()
302316
})
303317
})

0 commit comments

Comments
 (0)