0

If I wanted to group an array of objects according to the values on a given key, I might have code such as:

export const potentialProp = <T extends {}>(key: PropertyKey, x: T) => Maybe.fromUndefined(
    x[key],
);

export const groupByKey = <T, K extends keyof T & PropertyKey>(key: K, x: T[]) => x
    .reduce(
        (p, c) => {
            const thisKey = c[key];

            return {
                ...p,
                [thisKey]: potentialProp(thisKey, p) // Type 'T[string]' is not assignable to type 'symbol'
                    .map(currentGroup => [...currentGroup, c])
                    .getOrElse([c]),
            };
        },
        {},
    );

This all works fine, expect that when I try and use [thisKey] to define a computed property, I get the error:

Type 'T[string]' is not assignable to type 'symbol'

I can understand why this is happening; T[K] might be anything, and there's nothing to guarantee that the type of value at the key can be used as a key on a new object.

To get around this, I've tried the following:

if (
    keyType !== 'string'
        && keyType !== 'number'
        && keyType !== 'symbol'
) {
    return {};
}

In the hope that this would make the type sufficiently narrow to be able to be used as a computed property, but I was unfortunately mistaken in that.

Is it possible to get this to work in Typescript?

1 Answer 1

1

explicitly casting T[K] to type PropertyKey should do the trick.
but if T[K] might not be cast-able to PropertyKey, you should define a function that takes an "any" and returns a PropertyKey and define the casting logic there:
if it's a string, return a new PropertyKey with the appropriate data, etc.....

edit: cast to any value that can be used as a key

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.