Skip to content

Issue with type UpdateData<T> from firebase/firestore  #6105

@nwaughachukwuma

Description

@nwaughachukwuma

[REQUIRED] Describe your environment

  • Operating System version: Mac OS
  • Browser version: N/A
  • Firebase SDK version: "firebase": "9.6.8", "firebase-admin": "10.0.2", "@firebase/rules-unit-testing": "2.0.2",
  • Firebase Product: Firestore

[REQUIRED] Describe the problem

Steps to reproduce:

There is an issue with type UpdateData<T> imported from firebase/firestore, which fails to properly parse object type when data is nested deeper than one level - i.e. it passes foo.bar but not foo.bar.baz. Given the data shape and ops in the relevant code section, I get the following error on my IDE and also when I build my project:

Argument of type '{ [x: string]: UserRole; }' is not assignable to parameter of type '{ members?: FieldValue | { [x: string]: FieldValue | { role?: UserRole | FieldValue | undefined; status?: MemberStatus | FieldValue | undefined; } | undefined; } | undefined; name?: string | ... 1 more ... | undefined; } & AddPrefixToKeys<...>'.
  Type '{ [x: string]: UserRole; }' is not assignable to type 'AddPrefixToKeys<"members", { [x: string]: FieldValue | { role?: UserRole | FieldValue | undefined; status?: MemberStatus | FieldValue | undefined; } | undefined; }>'.
    'string' and '`members.${string}`' index signatures are incompatible.
      Type 'UserRole' is not assignable to type 'FieldValue | { role?: UserRole | FieldValue | undefined; status?: MemberStatus | FieldValue | undefined; } | undefined'.

Relevant Code:

type UserID = string
enum UserRole {
  Admin = 'Admin',
  Member = 'Member',
}
type MemberStatus = 'pending' | 'active'
interface TeamMember {
  role: UserRole
  status: MemberStatus
}

/** 
* this works
*/
interface Team {
  name: string
  members: Record<UserID, UserRole>
}
Update Op:
~.update({ [`members.${uid}`]: UserRole.Member })

/** 
* this doesn't work
*/
interface Team {
  name: string
  members: Record<UserID, TeamMember> 
}
Update Op:
~.update({ [`members.${uid}.role`]: UserRole.Member })

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions