【发布时间】:2021-12-29 14:32:13
【问题描述】:
我已经开发了几个前端应用程序,当我分析时,我经常需要在以下情况下重构前端代码或前端崩溃:
假设有一个端点 /movies 返回以下响应:
{
"movieName": "Avengers Endgame",
"genre": "Action, Thriller",
"length": 120 // in minutes
"rating": 4,
"id": 1
}
为了在前端应用程序(React + Typescript)中处理此端点的响应,我创建了一个MovieType 并将在组件中呈现数据。
// types.ts
export type MovieType = {
movieName: string;
genre: string;
length: number;
rating: number;
id: number;
}
import React from 'react';
function MovieComponent() {
const [movies, setMovies] = React.useState([] as MovieType[]);
React.useEffect(() => {
const data:MovieType[] = fetchDataSomeHow() as MovieType[];
setMovies(data);
})
return (
<ul>
movies.map(movie => (
<li key={movie.id}>
{movie.movieName.toLoweCase()} - {movie.rating}
</li>
))
</ul>
)
}
所以在这里我通过查看/movies 端点的响应创建了MovieType,并按照MovieType 中的要求标记了movieName。这里MovieType受/movies端点返回的数据影响。
由于我使用的是 Typescript,并且我已将 movieName 定义为 string 和 required,因此我可以使用 toLowerCase 方法而无需任何额外检查。
现在让我们假设电影数据库中有一些错误的输入并且在响应中movieName 是undefined/null 或movieName 更改为name。现在前端应用程序会因为运行时错误而崩溃。
每当由于数据库条目错误或后端 API 突然更改而导致前端和后端 API 合同不匹配时,就会发生这种情况。
是否有任何标准或好的方法来处理此类错误?我可以轻松地将每个字段设为可选,然后编写前端代码,但它会变得混乱且不可读。在后端,我们有适配器的概念,可以验证和清理数据并在无效请求的情况下抛出错误,但在前端,我们不能仅仅因为我们在一个对象中的一个字段错误而将用户挂在错误页面上在 1000 个对象中。
【问题讨论】:
-
也许conditional types 对你有用?
-
如果你不希望前端失败,你应该有一个后备值。如果缺少电影名称,请说“-”。通常,前端对象与从 API 返回的内容之间会有一个映射阶段,而不是盲目地将 API 响应指向前端对象。在该映射期间,您可以验证并分配空/空回退值。是的,很容易采取任何方式,但最好验证和映射我认为的每个字段。
-
@SanishJoseph - 这正是条件类型将有助于实现的目标。
-
@RandyCasburn 会自动分配回退值吗?说
movieName: string | null | "-"。当movieName为空而不显式分配“-”时,有没有办法获得“-”? -
是的,可以做到——点击我上面提供的链接并在该页面上搜索
default。单个结果描述了如何执行此操作。
标签: javascript reactjs typescript frontend