最近在做antd项目,使用typescript写layout组件,通过cloneElement给子组件的props添加initialState中的数据遇到飘红:
类型“ReactNode”的参数不能赋给类型“ReactElement<any, string | JSXElementConstructor<any>>”的参数。
这里涉及到下面两个知识点:
这是一种联合类型,可以是string、number、ReactElement、{}、boolean、ReactNodeArray。
是render的返回值,可以理解为展示到页面上的节点内容。
这是一种包含type、props、key这3种属性的对象。
type:组件的类型
props:组件的参数
key:组件的各种属性键值对
可以理解为虚拟dom里的组件,不能直接展示到页面上。
解决飘红很简单,将ReactNode类型转成ReactElement就行,代码如下:
{cloneElement(<>{children}</>, { ...currentUser, refresh })}
即将ReactNode用空节点包住,即可将ReactNode转成ReactElement。
但是又遇到了新的问题,这样children节点收不到props。
以上问题已有解决方法。
注意,使用umi框架的,可以通过定义app.tsx里的layout来解决。
编辑@/config/config.ts文件,启用layout:
layout: {
...defaultSettings,
import type { RunTimeLayoutConfig } from 'umi'
import { cloneElement } from 'react'
export const layout: RunTimeLayoutConfig = ({ initialState, setInitialState }) => {
return {
rightContentRender: () => <RightContent setInitialState={setInitialState} />,
footerRender: () => <Footer />,
disableContentMargin: false,
onPageChange: () => {
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<any, string | JSXElementConstructor<any>>”的参数。这里涉及到下面两个知识点: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 E
num < 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
python之元组知识点总结