Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在typescript中定义未知对象属性键_Javascript_Typescript_Vue.js - Fatal编程技术网

Javascript 如何在typescript中定义未知对象属性键

Javascript 如何在typescript中定义未知对象属性键,javascript,typescript,vue.js,Javascript,Typescript,Vue.js,通过Vue composition API,我们创建了以下可组合组件: import{computed,reactive,SetupContext,ref}来自'@vue/compositionapi' 导出常量useApplications=(根:SetupContext['root'])=>{ 常量应用程序=无功({ 1: { 名称:ref(root.$t('app1.name')), 描述:ref(root.$t('app1.description')), formName:'app1fo

通过Vue composition API,我们创建了以下可组合组件:

import{computed,reactive,SetupContext,ref}来自'@vue/compositionapi'
导出常量useApplications=(根:SetupContext['root'])=>{
常量应用程序=无功({
1: {
名称:ref(root.$t('app1.name')),
描述:ref(root.$t('app1.description')),
formName:'app1form',
},
2: {
名称:ref(root.$t('app2.name')),
描述:ref(root.$t('app2.description')),
formName:'app2form',
},
})
const getApplication=(id:string)=>{
退货申请[id]
}
返回{
应用程序:计算(()=>应用程序),
获取应用程序,
}
}
虽然代码工作正常,但会生成TS错误:

@typescript eslint/无不安全返回:任何类型值的不安全返回

将鼠标悬停在
应用程序
部分时,typescript可以识别除属性名(
1
)以外的类型:

我们需要创建一个解决这个问题的方法吗?我们需要重新定义接口中的每个属性吗?我尝试过类似的方法,但不正确:

interface IApplication {
  [key]: string {
    name : string
    description: string
    formName: string
  }
}

根据
无功
功能参数的结构,接口可定义如下:

interface IApplication {
  [key:string]:{
        name : string
       description: string
       formName: string
  }
}


根据
无功
功能参数的结构,接口可定义如下:

interface IApplication {
  [key:string]:{
        name : string
       description: string
       formName: string
  }
}


TypeScript通常不会键入内容,以便它们可以被任何字符串键索引。正如您所说,您可以为它定义一个接口:

接口应用程序{
[键:字符串]:{
名称:字符串;
描述:字符串;
formName:string;
};
}
// ...
常量应用程序:IAApplications=。。。
或者,您可以只对其对象部分使用一个类型,并对
应用程序使用内置的
记录
类型

接口应用程序{
名称:字符串;
描述:字符串;
formName:string;
}
// ...
常量应用程序:记录=。。。
或两者结合:

接口应用程序{
名称:字符串;
描述:字符串;
formName:string;
}
IApplications类型=记录;

(或者您可以内联
iaapplication
部分。或者…:-)

TypeScript通常不会键入内容,因此它们可以通过任何字符串键进行索引。正如您所说,您可以为它定义一个接口:

接口应用程序{
[键:字符串]:{
名称:字符串;
描述:字符串;
formName:string;
};
}
// ...
常量应用程序:IAApplications=。。。
或者,您可以只对其对象部分使用一个类型,并对
应用程序使用内置的
记录
类型

接口应用程序{
名称:字符串;
描述:字符串;
formName:string;
}
// ...
常量应用程序:记录=。。。
或两者结合:

接口应用程序{
名称:字符串;
描述:字符串;
formName:string;
}
IApplications类型=记录;

(或者您可以内联
iaapplication
部分。或者…:-)

出于好奇,为什么要使用带有数字键的对象而不是数组?对于Vue 2I中composition API中带有数组的对象,如果您知道所涉及的库,我将不得不相信这是一个答案。否则,它似乎无法解释任何事情。使用
数组是我第一次做的。但是,对于Vue 2中的Vue反应性系统,这种方法有很多优点。无论如何,感谢您的帮助,非常感谢。出于好奇,为什么要使用带数字键的对象而不是数组?对于Vue 2I中composition API中带数组的对象,如果您知道所涉及的库,我必须相信这是一个答案。否则,它似乎无法解释任何事情。使用
数组是我第一次做的。但是,对于Vue 2中的Vue反应性系统,这种方法有很多优点。无论如何谢谢你的帮助,非常感谢。谢谢你,这正是我想要的。我只是希望不必重新定义属性
name
description
formName
,因为TS通过自动解释已经知道了这些属性。但我们似乎需要创建一个完整的对象。@DarkLite1-是的,如果它能推断出那个部分就好了。也许这是可能的(事实如此之多),我只是没有立即看到它。:-)谢谢,那正是我想要的。我只是希望不必重新定义属性
name
description
formName
,因为TS通过自动解释已经知道了这些属性。但我们似乎需要创建一个完整的对象。@DarkLite1-是的,如果它能推断出那个部分就好了。也许这是可能的(事实如此之多),我只是没有立即看到它。:-)

import { computed, reactive, SetupContext, ref ,toRef} from '@vue/composition-api'
interface IApplication {
    name : string
    description: string
    formName: string
  }

export const useApplications = (root: SetupContext['root']) => {
  const state= reactive<Array<IApplication>>({ applications :
    [{
      name: ref(root.$t('app1.name')),
      description: ref(root.$t('app1.description')),
      formName: 'app1form',
    },
     {
      name: ref(root.$t('app2.name')),
      description: ref(root.$t('app2.description')),
      formName: 'app2form',
    }],
  })

  const getApplication = (index: number) => {
    return state.applications[index]
  }

  return {
    applications: toRef(state,'applications'),
    getApplication,
  }
}