最近在做antd项目,使用typescript写layout组件,通过cloneElement给子组件的props添加initialState中的数据遇到飘红:

类型“ReactNode”的参数不能赋给类型“ReactElement<any, string | JSXElementConstructor<any>>”的参数。

这里涉及到下面两个知识点:

ReactNode

这是一种联合类型,可以是string、number、ReactElement、{}、boolean、ReactNodeArray。
是render的返回值,可以理解为展示到页面上的节点内容。

ReactElement

这是一种包含type、props、key这3种属性的对象。
type:组件的类型
props:组件的参数
key:组件的各种属性键值对
可以理解为虚拟dom里的组件,不能直接展示到页面上。

解决飘红很简单,将ReactNode类型转成ReactElement就行,代码如下:

{cloneElement(<>{children}</>, { ...currentUser, refresh })}

即将ReactNode用空节点包住,即可将ReactNode转成ReactElement。
但是又遇到了新的问题,这样children节点收不到props。

以上问题已有解决方法。
注意,使用umi框架的,可以通过定义app.tsx里的layout来解决。

启用layout

编辑@/config/config.ts文件,启用layout:

    layout: {
        // https://umijs.org/zh-CN/plugins/plugin-layout
        ...defaultSettings,

编辑app.tsx

import type { RunTimeLayoutConfig } from 'umi'  // 必须启用layouut插件才能导入
import { cloneElement } from 'react'
// ProLayout 支持的api https://procomponents.ant.design/components/layout
export const layout: RunTimeLayoutConfig = ({ initialState, setInitialState }) => {
    return {
        rightContentRender: () => <RightContent setInitialState={setInitialState} />,
        footerRender: () => <Footer />,
        disableContentMargin: false,
        onPageChange: () => {
            // 如果没有登录,重定向到 login
            if (initialState == null) {
                history.push('/user/login')
        childrenRender: (children) => {
            if (!initialState || (!initialState.currentUser && history.location.pathname !== loginPath))
                return <PageLoading />  // 初始状态为空 或 初始状态中当前用户为空且当前路径不是登录路径,那么返回空页面!
            return (
                    {cloneElement(children, { ...initialState.currentUser })}
        ...initialState?.settings,

在这里写cloneElement,这里收到的children是JSX.Element类型,传给cloneElement不会飘红。
在这里可以将initialState中的数据传给各个页面组件。这样就不需要在各个页面组件中去用useModel(’@@initialState’)去获取初始数据。
但是需要提醒的是,一级路由下的页面可以正常收到初始数据,但二级路由下的页面不能收到,因为二级路由页面外面包了一层switch。
在umi官网中有关内容“
传参数给子路由”,按照里面的方法并不能解决问题。

typescript报错:类型“ReactNode”的参数不能赋给类型“ReactElement<any, string | JSXElementConstructor<any>>”的参数,如何解决? 最近在做antd项目,使用typescript写layout组件,通过cloneElement给子组件的props添加initialState中的数据遇到飘红:类型“ReactNode”的参数不能赋给类型“ReactElement&lt;any, string | JSXElementConstructor&lt;any&gt;&gt;”的参数。这里涉及到下面两个知识点:ReactNode这是一种联合类型,可以是string、number、ReactElement、{}、boolean、React Loxdown是Lox编程语言的一种实验型静态类型变体,在期间编写。 它最初是由鲍勃·尼斯特罗姆(Bob Nystrom)的出色著作。 静态类型系统是在以后添加的,因此实现的核心仍然是动态类型的树遍历解释器。 类型系统旨在既声音又富有表现力,以键入大多数Lox程序。 它具有几个高级功能,包括,,,零安全和。 免责声明:这并不是真正的实际用途。 这主要是为了学习有关实现语言和类型系统的更多信息。 本指南假定您熟悉 内置类型 开箱即用的是代表所有本机数据类型的类: Boolean Number String Array Function Class 还有一个称为Any的特殊类型,它表示未知类型的值。 您可以在变量名后用冒号分隔的变量声明中添加类型注释。 var x : String = "Hello, world!" ; 如果不添加类型,则 打字检查器 的验证了正确的代码类型检查。 但这很容易满足:为模块提供any类型都足以对其测试类型进行检查。 不正确的代码不进行类型检查也同样重要。 目前,尚无任何方法可以在DT中对此进行测试。 此仓库提供了有关如何添加的概念证明。 它以处理事物的方式。 _.find的测试如下所示: _ . find ( [ 1 , 2 , 3 ] , x => x * 1 == 3 ) ; // (this is just expected to type check) // $ExpectError Operator '==' cannot be applied to types 'number' and 'string'. _ . find ( [ 1 , 2 , 3 ] , x => x == 'a' ) ; // $ExpectType number _ . fin #define EMPTY 14 char LAnalysisStr[MAXSIZE]; //Left Analysis String char stack[SIZE]; //A Stack char expression[SIZE]; //Expression that inputed by user char G_Expression[SIZE]; //Generate Expression char symbol; //current char of expression int Index_exp; //The index of Expression int current_Index; //current index of expression char state = 0; //whether the Syntax is starting int LIndex; //The Index of Left Analysis String int AnalyseTrace[SIZE]; //Record the trace of Syntax Analyse int Index_Trace; //Syntax Analysiser Function Definate Below ... int E_Start(); int G_Syntax(); int T_Syntax(); int S_Syntax(); int F_Syntax(); //************************************************ /*************************************** Describe:Append append[] to String test[] after Index @Param: char test[], char append[] @Return: void @note: Never using this fuction ! *****************************************/ void append(char test[], char append[]) int i = 0; int Index = 0; while(LAnalysisStr[Index]!= '\0')Index++; while(append[i]!= '\0') test[Index] = append[i]; Index++; // name of 'LIndex' can not modify LIndex = Index; /*************************************** Describe:Modify the Generate expression @Param: char pre, char substance[] @Return: void *****************************************/ void modify(char pre, char substance[]) int i = 0; int j = 0; int k = 0; char temp[SIZE]; strcpy(temp, G_Expression); //copy G_Expression to temp string puts(G_Expression); while((temp[i]!= pre) && (i < SIZE)) i++; //i is now point to the index of [pre] for(j = i,k = 0; j < strlen(substance) + i; j++, k++) temp[j] = substance[k]; //pre is instead of substance for(k = i + 1; k < strlen(G_Expression); k++,j++) temp[j] = G_Expression[k]; //The rest of G_Expression is copy to temp temp[j] = '\0'; //temp is end of '\0' strcpy(G_Expression, temp); // copy temp to G_Expression /*************************************** Describe:Printing the Trace of the Syntax Analyser @Param: void @Return: void *****************************************/ void PrintTrace() int i = 0; while(AnalyseTrace[i] != 0) switch(AnalyseTrace[i]) case 1: modify('E',"TG"); break; case 2: modify('T',"FS"); break; case 3: modify('G',"+TG"); break; case 4: modify('G',"-TG"); break; case 5: modify('S',"*FS"); break; case 6: modify('S',"/FS"); break; case 7: modify('F',"(E)"); break; case 8: modify('F',"i"); break; case 9: modify('G',"@"); break; case 10: modify('S',"@"); break; printf("%c\n",25); puts(G_Expression); /*************************************** Describe:Geting Expression that inputed by user; @Param: void @Return: void *****************************************/ void GetExpression() char in; printf("Input Expression below <end of '#'>:\n"); Index_exp = 0; in = getchar(); while(in != '#') expression[Index_exp++] = in; in = getchar(); /*************************************** Describe:Printing Expression that inputed by user; @Param: void @Return: void *****************************************/ void PrintExpression() int i = 0; printf("You have inputed below:\n"); for(i = 0; i < Index_exp; i++) printf("%c",expression[i]); printf("\n"); printf("********************************************************\n"); printf("| \t%c Analysing... %c\t\t\t|\n",EMPTY,EMPTY); printf("********************************************************\n"); printf("Syntax | Analysing String | Analysing char | Rest Expression String\n"); /*************************************** Describe:Printing Expression that analysis @Param: void @Return: void *****************************************/ void PrintAnalysisExpression() int i = 0; for(i = 0; i <= current_Index; i++) printf("%c",expression[i]); printf("\t"); /*************************************** Describe:Printing Expression that wait to be analysed @Param: void @Return: void *****************************************/ void PrintRestExpression() int i; printf("\t\t"); for(i = current_Index; i < Index_exp; i++) printf("%c",expression[i]); printf("\n"); int G_Syntax() if(expression[current_Index] == '+') printf("[G -> +TG]\t\t"); AnalyseTrace[Index_Trace++] = 3; PrintAnalysisExpression(); printf("%c\t",expression[current_Index]); PrintRestExpression(); current_Index++; // T_Syntax & G_Syntax if(!T_Syntax()) {return 0;} if(!G_Syntax()) {return 0;} //return to E_Start return 1; else if(expression[current_Index] == '-') printf("[G -> -TG]\t\t"); AnalyseTrace[Index_Trace++] = 4; PrintAnalysisExpression(); printf("%c\t",expression[current_Index]); PrintRestExpression(); current_Index++; // T_Syntax & G_Syntax if(!T_Syntax()) {return 0;} if(!G_Syntax()) {return 0;} //return to E_Start return 1; printf("G -> %c\t\t\t",EMPTY); AnalyseTrace[Index_Trace++] = 9; PrintAnalysisExpression(); printf("%c\t",expression[current_Index]); PrintRestExpression(); /**************************************** Describe: S gernerate syntax @Param: void @Return: int *****************************************/ int S_Syntax() if(expression[current_Index] == '*') printf("[S -> *FS]\t\t"); AnalyseTrace[Index_Trace++] = 5; PrintAnalysisExpression(); printf("%c\t",expression[current_Index]); PrintRestExpression(); current_Index++; if(!F_Syntax()) // F_Syntax fail then return {return 0;} if(!S_Syntax()) {return 0;} return 1; else if(expression[current_Index] == '/') printf("[S -> /FS]\t\t"); AnalyseTrace[Index_Trace++] = 6; PrintAnalysisExpression(); printf("%c\t",expression[current_Index]); PrintRestExpression(); current_Index++; if(!F_Syntax()) // F_Syntax fail then return {return 0;} if(!S_Syntax()) {return 0;} return 1; printf("S -> %c\t\t\t",EMPTY); AnalyseTrace[Index_Trace++] = 10; PrintAnalysisExpression(); printf("%c\t",expression[current_Index]); PrintRestExpression(); return 1; return 1; /*************************************** Describe: T gernerate syntax @Param: void @Return: int *****************************************/ int F_Syntax() if(expression[current_Index] == '(') AnalyseTrace[Index_Trace++] = 7; printf("[F -> (E)]\t\t"); PrintAnalysisExpression(); printf("%c\t",expression[current_Index]); PrintRestExpression(); current_Index++; // Get next char in expression return 1; else if(expression[current_Index] == 'i') AnalyseTrace[Index_Trace++] = 8; printf("[F -> i]\t\t"); PrintAnalysisExpression(); printf("%c\t",expression[current_Index]); PrintRestExpression(); current_Index++; // Get next char in expression return 1; return 0; /*************************************** Describe: T gernerate syntax @Param: void @Return: int *****************************************/ int T_Syntax() printf("[T -> FS]\t\t"); AnalyseTrace[Index_Trace++] = 2; if(state) PrintAnalysisExpression(); printf("%c\t",expression[current_Index]); {printf("\t%c\t",expression[current_Index]);} PrintRestExpression(); //LAnalysisStr[LIndex++] = ''; state = 1; if(!F_Syntax()) // F_Syntax fail then return {return 0;} if(!S_Syntax()) {return 0;} return 1; /*************************************** Describe: E gernerate syntax @Param: void @Return: int *****************************************/ int E_Start() current_Index = 0; // Current Index of Expression printf("[E -> TG]\t\t"); printf("\t%c\t",expression[current_Index]); PrintRestExpression(); AnalyseTrace[Index_Trace++] = 1; if(!T_Syntax()) {return 0;} if(!G_Syntax()) {return 0;} {return 1;} return 0; /*************************************** Describe: Main @Param: void @Return: void *****************************************/ main() GetExpression(); PrintExpression(); if(E_Start() == 1) printf("********************************************************\n"); printf("| \t%c Trace of Analysing %c\t\t\t\t|\n",EMPTY,EMPTY); printf("********************************************************\n"); G_Expression[0] = 'E'; PrintTrace(); printf("********************************************************\n"); printf("| \t%c ACCEPT! %c\t\t\t\t\t|\n",EMPTY,EMPTY); printf("********************************************************\n"); printf("\n\n\tPress any key to quit\n"); getchar(); printf("********************************************************\n"); printf("| \t%c ERROR %c\t\t\t\t|\n",EMPTY,EMPTY); printf("********************************************************\n"); printf("\n\t[Press any key to quit]\n"); getchar(); }/*end of if*/ getchar(); Array < Type> : [ ... values : Type ] Shallow < Type> : { ... properties : Type } Monad < Type> : ( arg : Type ) => Type Maybe < Type> : Type | none Tuple < A> : [ A , B , ... ,
interface PreProcessorProps { error?: boolean | BooleanFunction loading?: boolean | BooleanFunction children: React.ReactNode | RenderFunction const PreProcessor: React.FC = ({ children }) => { return children 在使用ts写React时,尴尬的遇到了这个错误 不能类型“({
问题: vsCode使用TypeScript或Flow爆红,显示语法错误,如何解决? 原因: vsCode自身的语法检查有些问题 解决办法: 设置里搜索一下javascript.validate.enable,把勾去掉,改为false:禁用默认的JS验证 总结: 由于vsCode自身的语法检查有些问题,所以可以用第三方工具比如eslint或者tslint 来进行静态检查
type-guards 该模块允许您以强类型明确方式编写运行时验证。 换句话说,它为您提供了一种不错的方法,即通过编写验证函数并使代码保持DRY并随其获取TypeScript类型。 $ yarn add type-guards import * as tg from 'type-guards' const isUser = tg . isOfShape ( { name : tg . isString , age : tg . isNumber , // we purposely mark it as "any" to imitate API response or user's input // (anything generated at runtime which we cannot give a static type to) const john
type AnyRecord = Record < string> // Describes an object without properties type EmptyObject = { [ key : string ] : never ; [ key : number ] : never } 仿真类型 interface Class < T> extends Function { new ( ... args : any [ ] ) : T type Enum < E> = Record < keyof> & { [ key : number ] : string } type Primitive
这个错误是因为你在代码中将一个类型为 `ComputedRef<any>` 的变量赋值给了一个类型为 `string` 的变量。`ComputedRef` 是 Vue 3 中用于计算属性的类型,它返回的是一个响应式的对象,而不是一个普通的值。因此,你需要将 `ComputedRef` 对象中的值提取出来,然后再将其赋值给 `string` 类型的变量。例如: ```typescript import { computed } from 'vue' const myComputedValue = computed(() => { return 'hello world' const myString: string = myComputedValue.value 在上面的代码中,我们首先使用 `computed` 函数创建了一个计算属性 `myComputedValue`,它的值是一个字符串 `'hello world'`。然后,我们使用 `myComputedValue.value` 来获取计算属性的值,并将其赋值给 `myString` 变量,这样就避免了类型错误。
typescript报错:类型“ReactNode”的参数不能赋给类型“ReactElement<any, string | JSXElementConstructor<any>>”的参数,如何解决? 15310 大佬写的很好,就是我在安装的时候遇到了两个小问题 在编辑pacman.conf时,大佬给出的命令是 kate /etc/pacman.conf,但是kate是kde桌面的文本编辑器,如果使用cinnamon等其他桌面,应该使用vim之类的工具 还有一个安装密钥的那段命令,大佬给出的第一个命令是 sudo pacman -Sy archlinux-keyring haveged,但是这会产生一个问题,他是先更新的haveged,再安装的archlinuxcn密钥,所以haveged还没启动,这样会卡在正在本地签名那块,应该先sudo pacman -Sy haveged,再sudo systemctl enable haveged,再sudo pacman -Sy archlinuxcn-keyring python之元组知识点总结 左开右闭,左包右不包,含前舍后都行,知道里面意思即可,怎么表述不讲究,又不是搞文学创作。