FirebaseExtended / FirebaseExtended/reactfire
Feature request: enforce generic types when passed to `ReactFireOptions`
- 主要语言
- TypeScript
- 星标
- 3.6k
- 派生
- 403
- 平均合并
- 14 小时 53 分钟
- 30 天内合并 PR
- 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 还没有评估数据。