Vue JS 中的数组操作和 Typescript 错误

Posted

技术标签:

【中文标题】Vue JS 中的数组操作和 Typescript 错误【英文标题】:Array manipulation and Typescript error in Vue JS 【发布时间】:2021-10-29 07:46:45 【问题描述】:

我正在尝试检查一个列表(列表 A)中的项目是否包含在另一个列表(列表 B)中,如果是,则列表 B 中相应项目的属性/字段应更改其布尔值.

这是我的代码:

export default defineComponent(
  name: 'Users',
  props: 
      existingUsers : 
          type: Array as PropType<Array<UserModel>>,
      
  ,
  async setup(props) 
    const allUsers = ref<Array<UserModel>>(await userService.list())
    const userList = ref<Array<UserModel>>([ id: 0, email: '', first_name: '', last_name: '', ])
   
    function defineUsers(): Array<UserModel> 
        if (props.existingUsers) 
            const existingUsers = props.existingUsers
            userList.value = allUsers.value
            .map((user: UserModel) => existingUsers
            .forEach((us: UserModel) => (us.id === user.id) ? user.isSelected = true : user)))
            return userList.value;
         else 
            userList.value = allUsers.value
            return userList.value
        
    
    defineUsers();

基本上,如果没有现有用户作为 props 传递,则 userList 等于 allUsers(从 GET 请求获取值到 API)。如果存在作为 props 传递的现有用户,则应相应修改变量 allUsers:existingUsers 中包含的 allUsers 中的每个用户都需要将其 'isSelected' 值设置为 true。

这是我在函数 defineUsers 内的第 3 行上与 userList.value 相关的错误:

类型 'ComputedRef' 缺少来自类型 ' id: number; 的以下属性电子邮件:字符串;名字:字符串;姓氏:字符串;组织?: id:号码;公司名称:字符串;地址:字符串;邮政编码:字符串;城市:字符串;状态:字符串;国家:字符串;增值税:字符串;财政代码?:字符串 |不明确的; codeice_sdi?: 字符串 |不明确的;注册日期?:字符串 | undef...':长度、pop、push、concat 和另外 28 个。Vetur(2740)

关于如何解决这个问题的任何线索?

非常感谢。

【问题讨论】:

【参考方案1】:

我就是这样解决的:

function defineUsers(): Array<UserModel> 
    if (props.existingUsers) 
        const existingUsers = props.existingUsers
        userList.value = allUsers.value.map((user: UserModel) => 
            let isSelected = existingUsers.some((us: UserModel) => 
                us.id === user.id
            );
            user.isSelected = isSelected;
            return user;
        );
        return userList.value;
     else 
        return allUsers.value;
    

    

【讨论】:

【参考方案2】:

你不能使用 .forEach 方法作为返回类型,你需要这样做


userList.value = allUsers.value.map((user: UserModel) =>
  existingUsers.map((us: UserModel) => 
    user.isSelected = us.id === user.id;
    return user;
  )
);

让我知道这是否可行!

【讨论】:

Grazie Cosimo。我现在收到以下错误:Type 'UserModel[][]' is notassignable to type ' id: number;电子邮件:字符串;名字:.....'

以上是关于Vue JS 中的数组操作和 Typescript 错误的主要内容,如果未能解决你的问题,请参考以下文章

使用 Vue JS Typescript 迭代一个对象 -> 数组 -> 对象

使用Typescript和类组件装饰器时如何将数组传递给Vue中的props

Vue.js + Typescript:如何将@Prop 类型设置为字符串数组?

Vue js,使用 TypeScript 从 Vue 中的表单获取数据

使用 Typescript 的反应式 Vue Chart.js 组件

WEBSTORM最新版,震撼来袭WebStorm 2018.1更好地支持Vue.js和React Native……