FirebaseExtended / FirebaseExtended/reactfire

Feature request: enforce generic types when passed to `ReactFireOptions`

オープン
#383 コメント 0 件 リアクション 3 件 担当者 0 名 GitHub で見る
v5
主要言語
TypeScript
スター
3.6k
フォーク
403
平均マージ
14時間 53分
マージ済み PR(30日)
5

説明

### Enforce generic types when passed to `ReactFireOptions`, update various types

Hey guys, will try to keep this short. Right now `ReactFireOptions` is generic on `T` but the type of `initialData`, which should be _only_ of_ type `T` is of type `T | any`.

```ts
export interface ReactFireOptions {
idField?: string;
initialData?: T | any;
/**
* @deprecated use initialData instead
*/
startWithValue?: T | any;
suspense?: boolean;
}
```

The result of this is that the generic parameter is useless, as we don't get any type enforcement on `initialData`. For example, this is fine:

```ts
interface MyInterface {
thing: string;
}

const foo: ReactFireOptions = {
initialData: {
thing: 2 // no complaints
}
}
```

My suggestion is to change `ReactFireOptions` to this:

```ts
export interface ReactFireOptions {
idField?: string;
initialData?: T;
/**
* @deprecated use initialData instead
*/
startWithValue?: T;
suspense?: boolean;
}
```

This still allows users to pass whatever they want to `initialData` when not supplying a generic type, but will cause Typescript to complain when using a generic type and the value passed to `initialData` does not match the provided type.

```ts
interface MyInterface {
thing: string;
}

const foo: ReactFireOptions = {
initialData: {
thing: 2 // complains, "Type 'number' is not assignable to type 'string'."
}
}
```

Additionally, there are a few places using `{ [key: string]: unknown }`, which can be expressed more clearly with `Record`.

I have a branch with the following changes but I can't push it as I don't have permissions. Not sure if I need to ask for them somewhere.

Cheers! Great project, and I'm finding it very useful.

コントリビューションガイド

コントリビューションガイドを開く

評価

この issue はまだ評価されていません。

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。