Skip to content

[context] createContext function recommendation #60

@augustjk

Description

@augustjk

The current recommendation for createContext has

### `createContext` functions
It is recommended that TypeScript implementations provide a `createContext()` function which is used to create a `Context`. This function can just cast to a `Context`:
```ts
export const createContext = <ValueType>(key: unknown) =>
key as Context<typeof key, ValueType>;
```

This effectively makes typeof key to always be unknown.

Lit's implementation has

export function createContext<ValueType, K = unknown>(key: K) {
  return key as Context<K, ValueType>;
}

which allows taking an type argument for the context key. In order to take advantage of this though, both type arguments must be provided. If only ValueType is provided, K defaults to unknown as TypeScript does not do partial inference of type arguments.

Now in practice, I don't think having an explicit KeyType be provided to Context is quite necessary. The extraction of the ValueType does not require it:

```ts
export type ContextType<Key extends Context<unknown, unknown>> =
Key extends Context<unknown, infer ValueType> ? ValueType : never;
```

I'm a bit torn as it feels correct to allow explicitly typing the KeyType as in the Lit implementation, but if it's functionally moot, that creates confusion like lit/lit#4601

One issue with having KeyType be unknown is that it can look confusing. With unknown & {__context: ValueType}, it just looks like {__context: ValueType} in type intellisense.
e.g.

const key = Symbol('foo');
const foo = createContext<{foo: string}>(key);
//    ^? const foo: {
//           __context__: {
//               foo: string;
//           };
//       }

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions