在 TypeScript/React 的映射函数中转换正确的类型
Posted
技术标签:
【中文标题】在 TypeScript/React 的映射函数中转换正确的类型【英文标题】:Casting correct type in a map function in TypeScript/React 【发布时间】:2021-10-19 06:26:49 【问题描述】:在 TypeScript/React 中映射对象时,我无法转换正确的类型。
我收到以下错误:“对象”类型上不存在属性“urls”。 TS2339
我能够解决此问题的唯一方法是设置任何,我意识到这是糟糕的糟糕。
我尝试使用对象中存在的属性创建一个接口,但这不起作用。
我是 TypeScript 的新手,所以任何帮助都会很棒。谢谢!
images.map((image: object, key: number) => (
<Image
imageDesktop=image.urls.regular
imageMobile=image.urls.small
description=image.alt_description
author=image.user.name
url=image.links.html
/>
))
# Tried useing this Interface to set type to replace object, but got this error:
Argument of type '(image: ImageType, key: number) => JSX.Element' is not assignable to parameter of type '(value: object, index: number, array: object[]) => Element'.
Types of parameters 'image' and 'value' are incompatible.
Type '' is missing the following properties from type 'ImageType': urls, alt_description, user, links TS2345
interface ImageType
urls:
regular: string;
small: string;
;
alt_description: string;
user:
name: string;
;
links:
html: string;
;
【问题讨论】:
“我尝试使用对象中存在的属性创建一个接口,但这不起作用。”请详细说明这一点。为什么它不起作用?您看到了什么样的错误? 我看到了url
的属性,但没有看到urls
的属性。
在这种情况下不要使用object
类型。使用Record<string, unknown>
@AlexandervanOostenrijk 我将此添加到我的问题中,谢谢:)
@captain-yossarian 这是我尝试你的想法时遇到的错误:'(image: Record有两种方法可以做到这一点:
使用对象的记录,例如图像:
记录
这意味着一个记录,其中键是字符串,值可以是“任何”事物。基本上是js对象的定义。如果您只想让您的函数接受对象,请使用它。
-
使用图像的所有属性定义一个类,并使用类名作为类型。这是一个更好的解决方案,因为您验证了每个属性。
【讨论】:
【参考方案2】:-
您可以像这样创建适合您使用的界面。
interface UrlType
regular: string;
small: string;
interface UserType
name: string;
interface LinkType
html: string;
interface ImageType
urls: UrlType;
alt_description: string;
user: UserType;
links: LinkType;
// @ts-ignore
images.map((image: ImageType, key: number) => (
<Image
imageDesktop=image.urls.regular
imageMobile=image.urls.small
description=image.alt_description
author=image.user.name
url=image.links.html
/>
));
或2.你可以忽略所有错误(但不推荐)
// @ts-ignore
images.map((image: object, key: number) => (
// @ts-ignore
<Image
// @ts-ignore
imageDesktop=image.urls.regular
// @ts-ignore
imageMobile=image.urls.small
// @ts-ignore
description=image.alt_description
// @ts-ignore
author=image.user.name
// @ts-ignore
url=image.links.html
/>
));
【讨论】:
我试过这个,并用错误输出将它添加到我的问题中:) @lucasjohnson 请查看编辑。我刚刚添加了一个简单的ts-ignore
应该可以解决您的问题...以上是关于在 TypeScript/React 的映射函数中转换正确的类型的主要内容,如果未能解决你的问题,请参考以下文章
Typescript React 空函数作为 defaultProps
Typescript/React 单元测试库,能够单步调试导入的函数
挣扎于 TypeScript、React、Eslint 和简单的箭头函数组件
将函数作为道具传递给 Typescript React 功能组件