首页 > 其他分享 >[React Typescript] Well typed a React Context provider

[React Typescript] Well typed a React Context provider

时间:2023-08-16 20:33:50浏览次数:43  
标签:Typescript const typed React createRequiredContext return null contextValue

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>
    </>
  );
};

 

标签:Typescript,const,typed,React,createRequiredContext,return,null,contextValue
From: https://www.cnblogs.com/Answer1215/p/17636110.html

相关文章

  • [React Typescript] Fixing type inference in a Custom React Hook
    //Problemimport{useState}from"react";import{Equal,Expect}from"../helpers/type-utils";exportconstuseId=(defaultId:string)=>{const[id,setId]=useState(defaultId);return[id,setId];};const[id,setI......
  • typeScript学习-interface和type 区别
    typeScript学习interface(接口)和type区别type和接口类似,都用来定义类型,但type和interface区别如下:区别1:定义类型范围不同interface只能定义对象类型或接口当名字的函数类型。type可以定义任何类型,包括基础类型、联合类型、交叉类型,元组。//type定义基础类型typ......
  • react 状态管理
    sroreindex.tsximportReactfrom'react';//仓库文件桶importStoreContentfrom'./StoreContent';importSetDataBtnfrom'./SetDataBtn';importShowDataBoxfrom'./ShowDataBox';functionIndex(){return(<&......
  • React(涉及基础和Usestate)
    ReactReact是JavaScript的一个类库;RenderingUserInterfacesReactTounderstandhowReactworks,wefirstneedabasicunderstandingofhowbrowsersinterpretyourcodetocreateinteractiveuserinterfaces(UI).浏览器构建用户界面原理Whenauservisitsa......
  • React和Vue的区别,大家怎么看?
    Vue更适合小项目,React更适合大公司大项目;Vue的学习成本较低,很容易上手,但项目质量不能保证......真的是这样吗?借助本篇文章,我们来从一些方面的比较来客观的去看这个问题。 论文档的丰富性从两个方面来看这个问题:社区的支持力度及文档的完善性。 对于任何编程语......
  • 图解 history api 和 React Router 实现原理
    Router是开发React应用的必备功能,那ReactRouter是怎么实现的呢?今天我们就来读一下ReactRouter的源码吧!首先,我们来学一下HistoryAPI,这是基础。什么是history呢?就是这个东西:我打开了一个新的标签页、然后访问baidu.com、sougou.com、taobao.com。长按后退按钮,就会列出......
  • 前端周刊第66期:TypeScript教程、ESM、React泡沫、htmx、测试文章
    周刊同步发表于微信公众号“写代码的宝哥”,欢迎各位小伙伴前来关注......
  • vue3+typescript中的props
     以上是子组件 以上是父组件<scriptsetuplangs="ts">letprops=defineProps(['info','money'])//父子组件的通信需要用到defineProps方法去接受父组件想要传递的数据console.info(props)</script>需要注意的就是:props可以实现父子组件的通信,但是props的......
  • ❤ React08-React 组件的生命周期3
    ❤React08-React组件的生命周期33组件卸载时(卸载阶段)执行时间:组件从页面之中消失时componentDidMount(){}组件的挂载阶段componentWillUnmount(){}组件的卸载阶段组件的挂载阶段执行的一些方法可以在组件的卸载阶段除去组件的其他钩子函数旧版本生命周期钩子函数新版......
  • 快速解决 const 与 typedef 类型组合时 ,const修饰谁的问题
    C++使用typedef给复合类型定义别名时,与const结合会产生看似“令人困惑”的类型推定,例如typedefchar*pstring;constpstringcstr=0;constpstring*ps;cstr到底是什么类型?如果直接把pstring展开成char*,就会认为cstr是constchar*类型,从而认为cstr是一个指向const......