[React Typescript] Well typed a React Context provider

import React from "react";
import { Equal, Expect } from "../helpers/type-utils";

const createRequiredContext = <T extends any>() => {
  const context = React.createContext<T | null>(null);

  const useContext = <T extends any>() => {
    const contextValue = React.useContext(context);

    if (contextValue === null) {
      throw new Error("Context value is null");
    }

    return contextValue;
  };

  return [useContext, context.Provider] as const;
};

const [useUser, UserProvider] = createRequiredContext<{
  name: string;
}>();

const [useTheme, ThemeProvider] = createRequiredContext<{
  primaryColor: string;
}>();

const Child = () => {
  const user = useUser();

  type test = Expect<
    Equal<
      typeof user,
      {
        name: string;
      }
    >
  >;

  const theme = useTheme();

  type test2 = Expect<
    Equal<
      typeof theme,
      {
        primaryColor: string;
      }
    >
  >;

  return null;
};

const Parent = () => {
  return (
    <>
      <UserProvider value={{ name: "Matt" }}>
        <ThemeProvider
          value={{
            primaryColor: "blue",
          }}
        >
          <Child />
        </ThemeProvider>
      </UserProvider>
    </>
  );
};

 

posted @   Zhentiw  阅读(8)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
历史上的今天:
2022-08-16 [Typescript] Index access types
2022-08-16 [Typescript] Making TypeScript Stick - 6 - infer, build a ConstructorArg Type
2021-08-16 [Unit testing] Simplify Assertions on Error Messages with toMatchInlineSnapshot
2021-08-16 [SAA + SAP] 27. Cost saving for data transfer out AWS
2020-08-16 [Linear Algebra] Inverse and Transpose
2020-08-16 [Linear Algebra] Matrix-Matrix Multiplication
2019-08-16 [GraphQL] Set variable and default value & alias
点击右上角即可分享
微信分享提示