Javascript 如何在typescript中定义未知对象属性键
通过Vue composition API,我们创建了以下可组合组件: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
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,
}
}