art*_*ras 11 typescript reactjs next.js
我在dynamicimport from方面遇到了一个非常奇怪的问题NextJS。
我正在导入一个像这样的组件:
const Spinner = dynamic(() => import('components/ui/Spinner').then(mod => mod.Spinner))
Run Code Online (Sandbox Code Playgroud)
并且Spinner.tsx是
import {useEffect, useState} from 'react'
import PulseLoader from 'react-spinners/PulseLoader'
import {FadeHOC} from '.'
import theme from 'utils/theme'
interface Props {
inline?: boolean
}
const TIMEOUT = 1000
export const Spinner = ({inline}: Props) => {
const [show, setShow] = useState(false)
useEffect(() => {
const timeout = setTimeout(
() => setShow(true),
TIMEOUT
)
return () => clearTimeout(timeout)
}, [])
return (
show
? <FadeHOC>
<PulseLoader size={10} margin={3} color={theme.color} css={inline ? 'margin-left: 14px;' : 'display: block; text-align: center; margin: 100px auto;'} />
</FadeHOC>
: null
)
}
Run Code Online (Sandbox Code Playgroud)
在dynamic进口声明中我收到TypeScript投诉:
Argument of type '() => Promise<(({ inline }: Props) => JSX.Element) | ComponentClass<never, any> | FunctionComponent<never> | { default: ComponentType<never>; }>' is not assignable to parameter of type 'DynamicOptions<{}> | Loader<{}>'.
Type '() => Promise<(({ inline }: Props) => JSX.Element) | ComponentClass<never, any> | FunctionComponent<never> | { default: ComponentType<never>; }>' is not assignable to type '() => LoaderComponent<{}>'.
Type 'Promise<(({ inline }: Props) => Element) | ComponentClass<never, any> | FunctionComponent<never> | { default: ComponentType<never>; }>' is not assignable to type 'LoaderComponent<{}>'.
Type '(({ inline }: Props) => Element) | ComponentClass<never, any> | FunctionComponent<never> | { default: ComponentType<never>; }' is not assignable to type 'ComponentType<{}> | { default: ComponentType<{}>; }'.
Type '({ inline }: Props) => JSX.Element' is not assignable to type 'ComponentType<{}> | { default: ComponentType<{}>; }'.
Type '({ inline }: Props) => JSX.Element' is not assignable to type 'FunctionComponent<{}>'.
Types of parameters '__0' and 'props' are incompatible.
Type '{ children?: ReactNode; }' has no properties in common with type 'Props'.ts(2345)
Run Code Online (Sandbox Code Playgroud)
我不明白投诉的内容是什么,非常感谢您的帮助!
Sla*_*ava 15
dynamic是这样输入的:
export default function dynamic<P = {}>(dynamicOptions: DynamicOptions<P> | Loader<P>, options?: DynamicOptions<P>): React.ComponentType<P>;
Run Code Online (Sandbox Code Playgroud)
其中 P 是导入组件的 props
所以,dynamic期望得到Loader<P>==LoaderComponent<P>Promise<React.ComponentType<P>
你只需要告诉他道具是什么。像这样:
const Spinner = dynamic<{ inline?: boolean }>(
() => import('components/ui/Spinner').then(mod => mod.Spinner)
)
Run Code Online (Sandbox Code Playgroud)
或者
import { Spinner as StaticSpinner } from 'components/ui/Spinner'
const Spinner = dynamic<React.ComponentProps<typeof StaticSpinner>>(
() => import('components/ui/Spinner').then(mod => mod.Spinner)
)
Run Code Online (Sandbox Code Playgroud)
或将 Props 导出,然后:
import { Props as SpinnerProps } from 'components/ui/Spinner'
const Spinner = dynamic<SpinnerProps>(
() => import('components/ui/Spinner').then(mod => mod.Spinner)
)
Run Code Online (Sandbox Code Playgroud)
React.FC@brc-dd 是对的,只需用类型定义组件即可,
export const Spinner: React.FC<Props> = ({inline}) => {}
虽然很少解释为什么它会这样工作:
dynamic是这样输入的:
export default function dynamic<P = {}>(dynamicOptions: DynamicOptions<P> | Loader<P>, options?: DynamicOptions<P>): React.ComponentType<P>;
Run Code Online (Sandbox Code Playgroud)
所以它期望你返回React.ComponentType<P>,这意味着:
type ComponentType<P = {}> = ComponentClass<P> | FunctionComponent<P>;
Run Code Online (Sandbox Code Playgroud)
并且FunctionComponent是:
interface FunctionComponent<P = {}> {
(props: PropsWithChildren<P>, context?: any): ReactElement<any, any> | null;
propTypes?: WeakValidationMap<P>;
contextTypes?: ValidationMap<any>;
defaultProps?: Partial<P>;
displayName?: string;
}
Run Code Online (Sandbox Code Playgroud)
所以你必须有带children钥匙的道具。如果你不想弄乱你的组件接口并且它实际上不接受子组件,那么你可以只输入children?: never;组件 Props 接口。
| 归档时间: |
|
| 查看次数: |
14868 次 |
| 最近记录: |