Description
[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 })