reactjs - 声明字符串类型仅适用于 as-syntax (TypeScript - React)
问题描述
我正在尝试使用 React 中的 TypeScript 将字符串类型分配给“播放器”,但它不像player: string
选项 1 那样简单地工作。
选项1:
Object.values(data.val()).forEach((player: string) => {
newPlayers.push(player);
});
上述方式产生一个 ts err:
'(player: string) => null' 类型的参数不能分配给 '(value: unknown, index: number, array: unknown[]) => null' 类型的参数。参数 'player' 和 'value' 的类型不兼容。类型“未知”不可分配给类型“字符串”.ts(2345)
但是使用 as-syntax,如下所示,可以更正它。这是为什么?
选项 2:
DB_players.once('value', (data) => {
// Fetch players who signed up
const newPlayers: string[] = [];
if (data.val() ) {
Object.values(data.val()).forEach((player) => {
newPlayers.push(player as string);
});
setPlayers(newPlayers); // save the new player list
}
});
解决方案
您的地图函数中的类型player
不是您应该分配的东西。该类型来自您要映射的数组的元素类型。
Typescript 认为返回的对象的值data.val()
是 type unknown
。这是您需要修复的错误。最好,您应该在创建对象的代码中将其修复得更高,data
方法是说data.val()
返回Record<string, string>
带有字符串值的 a 或其他类型。作为一个创可贴,您可以通过编写告诉 typescript 您正在将其用作字符串数组,(Object.values(data.val()) as string[])
并且您的错误将消失。
与打字稿错误无关,@kind 用户是正确的,map
如果您不返回任何内容,则不应使用。如果newPlayers
是一个现有数组,其中已经包含您要添加的数据,那么您可以保留您的push
,而是在forEach
循环中执行。如果这是您创建newPlayers
数组的地方,并且它为每个玩家提供一个条目,data.val
那么您可以从 a 的返回值创建它map
——除了您实际上没有在此处进行任何映射,您只是返回相同的价值。
这个单行程序与您的循环执行相同的操作,即将所有名称附加data.val()
到现有数组中。这...
意味着它们将作为单独的条目添加。
newPlayers.push( ...Object.values(data.val()) as string[] );
如果您发布更多代码 -data
来自哪里以及在哪里newPlayers
初始化,那么我可以为您提供更好的解决方案。
编辑:
要创建数组,您可以直接使用对象值。
const newPlayers = Object.values(data.val()) as string[];
或者
setPlayers( Object.values(data.val() ) as string[] );
推荐阅读
- python - 我将如何计算这个 python 程序的运行时间、内存和 CPU 使用率?
- debugging - 模拟器中的 Apple Id 登录授权
- c - linux中的参数到argv
- firebase - 错误状态:DocumentSnapshotPlatform 中不存在字段
- python - 如何通过虚拟相机将 OpenCV 视频源发送到 Python?
- azure-functions - Azure Functions 有哪些选项可以使用额外的硬盘驱动器?
- reactjs - 如何在同一行设置段落、按钮和文本框?
- database - 如何在 Docker 中将 mg_client 连接到容器外?
- amazon-web-services - 如何在 AWS Educate 中检查正在运行的资源
- shell - bash:通过grep匹配单引号和双引号