当前位置: 首页 > 知识库问答 >
问题:

为什么我得到的类型'字符串[]|未定义'不是一个数组类型."我的对象变量?

龙才俊
2023-03-14

我试图创建一个名为hidden的状态变量作为字典(例如:[{'cutomkey1':'somevalue','customkey2':'somevalue'}])。隐藏可以是空的[{}]

在我的一个方法中,我想将一个项目{'asd':'asd'}推送到隐藏状态变量并将它们相加。

我一直在提示这个错误:

类型'String[]|未定义'不是数组类型。

我是typescript新手,我不确定我是否正确设置了所有变量。这是我的代码(仅相关部分):

import React from 'react';

export type AppState = {
    tickets?: Ticket[],
    hidden?: Array<String>,
    search: string;
}

export class App extends React.PureComponent<{}, AppState> {

    state: AppState = {
        search: '',
        hidden: [] 
    }

    hideCard = (e: React.SyntheticEvent<EventTarget>) => {
        let targ = e.target as HTMLElement
        let parent = targ.parentElement as HTMLElement  
        let dict: Map<string, string> = new Map();
        dict.set(parent.id, parent.id)
        this.setState({
            hidden: [...this.state.hidden, {dict}]
        })
        console.log(this.state.hidden)
        parent.classList.add('hideTkt')
    }



}

export default App;

新代码:

export type AppState = {
    tickets?: Ticket[],
    hidden?: Array<String> | undefined,
    search: string;
}

export class App extends React.PureComponent<{}, AppState> {

    state: AppState = {
        search: '',
        hidden: [] 
    }


    hideCard = (e: React.SyntheticEvent<EventTarget>) => {
        let targ = e.target as HTMLElement
        let parent = targ.parentElement as HTMLElement  
        let dict: Map<string, string> = new Map();
        dict.set(parent.id, parent.id)
        if (this.state.hidden) {
            this.setState({
                hidden: [...this.state.hidden, {dict}]
            })
        }
        console.log(this.state.hidden)
        parent.classList.add('hideTkt')
    }

这就是错误:

键入“(字符串|{dict:Map

共有2个答案

雍光远
2023-03-14

如果你仔细阅读创建隐藏数组的代码,

     if (this.state.hidden) {
            this.setState({
                hidden: [...this.state.hidden, {dict}]
            })
        }

您可以看到您扩展了state.hidden元素(没有pb,它们已经是正确的类型,任何类型,我们都无所谓,因为它们来自以前的类型良好且构建良好的数组),但是,然后您添加了一个literal对象,该对象具有名为dict的属性,类型为Map

这意味着您的数组将包含具有与此接口相关的“dict”属性的对象:{dict:Map

你能做的是:

  1. 键入隐藏为数组
    interface MyInterface
     { 
      dict:Map<string,string>;
    }

然后将数组键入array

还有很多其他的选择,但这些是你可以遵循的主要途径。最后,如果您真的希望“隐藏”状态变量是一个字典,请将其键入映射

     if (this.state.hidden) {
            this.setState({
                hidden: new Map([...Array.from(this.state.hidden.entries()), ...Array.from(dict.entries())])
            })
        }

如果你以ES6为目标,你不必做所有这些健身房,因为这将起作用:

     if (this.state.hidden) {
            this.setState({
                hidden: new Map([...this.state.hidden, ...dict])
            })
        }

顺便说一句,我认为当你在地图中设置对象时,你想做dict.set(target.id,parent.id)而不是dict.set(parent.id,parent.id)。如果不是,在这里使用地图有什么意义?

严修诚
2023-03-14

声明隐藏?:数组

使用这样的属性将失败:

hidden.push(项目)

因为隐藏可以是未定义(并且未定义没有属性推送)。

如果您检查this.state.hidden是否可用,typescript将不再抱怨:

if(this.state.hidden)
  this.setState({
              hidden: [...this.state.hidden, {dict}]
          })

或者你可以提供一个默认值使用空隐藏:

...(this.state.hidden ?? [])

 类似资料:
  • 问题内容: 我必须知道是String还是任何其他类类型,该怎么办?目前,我像下面那样做,但是它的编码不是很好。 问题答案: 是如果对象是或的子类 是仅当对象是一个

  • 问题内容: 我只是想知道为什么Google Go中的字符串函数是在包中定义的,而不是在数据类型本身上定义的。他们本可以轻松完成 而不是当前 在包装中。 我的猜测是,如果您想在扩展的自定义类型上实现的自定义版本(即),则无法再访问该类型的内置函数,但是我找不到对此的任何支持。 问题答案: 简短的答案是:“保持语言简单”。 作为一种语言运行,仅允许在同一程序包中的类型上定义方法,但是由于(像其他内置类

  • 我有财产课: 还有一种方法: 在类的构造函数我有: 为什么当我从object按键调用函数时。我收到一条未定义的消息,为什么变量在内部不可用:

  • 我有一个json格式的地图列表,我正试图在列表上呈现“title”。 我通过一个api(http.get)读取数据,然后解析它。 我想在列表中显示标题。 这是我的代码... 获取数据 转换为json 欢迎参加模范班 我得到一个错误说"类型'列表'不是类型'地图的子类型

  • 当我将接口的任何属性设置为可选时,我会在将其成员分配给其他变量时遇到如下错误: 我如何绕过这个错误?

  • 此代码有效。它以“未检查或不安全操作”警告进行编译和运行。 当这两个给我运行时错误时 我遇到的错误如下: