FirebaseExtended / FirebaseExtended/reactfire

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

未关闭
#383 0 条评论 3 个 reaction 已指派 0 人 在 GitHub 查看
v5
主要语言
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 还没有评估数据。

把新 issue 发到你的邮箱

精选适合新手参与的 GitHub issue 摘要。