TSX/JSX 项目中的可选 JSX 道具
Optional JSX Props In a TSX/JSX Project
我有一个要从 JS 转换为 TS 的 React 项目。我 运行 遇到的一个问题是 TSX React 假设功能组件中定义的所有属性都是必需的道具。
// ComponentA.tsx
class ComponentA extends React.Component<any, any> {
render() {
/* Type '{ equalWidth: true; children: Element[]; }' is not assignable to type '{ children: any; className: any; equalWidth: any; }'.
* Property 'className' is missing in type '{ equalWidth: true; children: Element[]; }'.' */
return <ComponentB equalWidth />
}
}
和
// ComponentB.js
const ComponentB = ({ children, className, equalWidth }) => {
return (...)
}
有没有办法向 TS 表明 JSX 组件道具都是可选的?
假设 ComponentB.js
最终将成为 TypeScript 组件:
interface ComponentBProps {
children?: ReactNode;
className?: string;
equalWidth?: boolean;
}
const ComponentB = ({ children, className, equalWidth }: ComponentBProps) => {
//
};
在所有属性都是可选的特殊情况下,您可以从界面上的每个 属性 中删除 ?
并使用 Partial<ComponentBProps>
,但我想至少有些东西会最终成为必需的道具。
如果您想保持 ComponentB.js
不变,那么另一种解决方案是创建一个类型定义文件:
import { ReactNode, StatelessComponent } from "react";
interface ComponentBProps {
children?: ReactNode
className?: string;
equalWidth?: boolean;
}
export const ComponentB: StatelessComponent<ComponentBProps>;
如果您将 JavaScript 文件放入同一目录并且名称为 ComponentB.d.ts
,那么您应该能够在您的 TypeScript 文件中导入 ComponentB
。
我编写定义的方式假设该组件是一个 命名的导出 ,而不是默认的,即它像 export const ComponentB
在 [=19] 中导出=] 文件.
(可能)工作示例:https://github.com/fenech/tsx-jsx
一个最简单的选项是为您的可选道具设置一个默认值。例如,如果 className
是可选的,您可以将 ComponentB.js
更改为类似这样的内容。
const ComponentB = ({ children, className="", equalWidth }) => {
return (...)
}
另外,如果你在函数体中解构你的 props 而不是签名,TS 将不会抱怨输入。
const ComponentB = (props) => {
const { children, className, equalWidth } = props;
return (...)
}
我有一个要从 JS 转换为 TS 的 React 项目。我 运行 遇到的一个问题是 TSX React 假设功能组件中定义的所有属性都是必需的道具。
// ComponentA.tsx
class ComponentA extends React.Component<any, any> {
render() {
/* Type '{ equalWidth: true; children: Element[]; }' is not assignable to type '{ children: any; className: any; equalWidth: any; }'.
* Property 'className' is missing in type '{ equalWidth: true; children: Element[]; }'.' */
return <ComponentB equalWidth />
}
}
和
// ComponentB.js
const ComponentB = ({ children, className, equalWidth }) => {
return (...)
}
有没有办法向 TS 表明 JSX 组件道具都是可选的?
假设 ComponentB.js
最终将成为 TypeScript 组件:
interface ComponentBProps {
children?: ReactNode;
className?: string;
equalWidth?: boolean;
}
const ComponentB = ({ children, className, equalWidth }: ComponentBProps) => {
//
};
在所有属性都是可选的特殊情况下,您可以从界面上的每个 属性 中删除 ?
并使用 Partial<ComponentBProps>
,但我想至少有些东西会最终成为必需的道具。
如果您想保持 ComponentB.js
不变,那么另一种解决方案是创建一个类型定义文件:
import { ReactNode, StatelessComponent } from "react";
interface ComponentBProps {
children?: ReactNode
className?: string;
equalWidth?: boolean;
}
export const ComponentB: StatelessComponent<ComponentBProps>;
如果您将 JavaScript 文件放入同一目录并且名称为 ComponentB.d.ts
,那么您应该能够在您的 TypeScript 文件中导入 ComponentB
。
我编写定义的方式假设该组件是一个 命名的导出 ,而不是默认的,即它像 export const ComponentB
在 [=19] 中导出=] 文件.
(可能)工作示例:https://github.com/fenech/tsx-jsx
一个最简单的选项是为您的可选道具设置一个默认值。例如,如果 className
是可选的,您可以将 ComponentB.js
更改为类似这样的内容。
const ComponentB = ({ children, className="", equalWidth }) => {
return (...)
}
另外,如果你在函数体中解构你的 props 而不是签名,TS 将不会抱怨输入。
const ComponentB = (props) => {
const { children, className, equalWidth } = props;
return (...)
}