-
Notifications
You must be signed in to change notification settings - Fork 16
Description
The current recommendation for createContext
has
community-protocols/proposals/context.md
Lines 114 to 121 in 952f158
### `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
.
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:
community-protocols/proposals/context.md
Lines 101 to 104 in 952f158
```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;
// };
// }