如何解决具有预定义项和未知项的递归接口
我正在尝试创建一个界面,但似乎无法弄清楚为什么会出现此错误以及如何解决它。
类型
'_a'
的属性'IItem | IItem[] | undefined'
无法分配给字符串索引类型'{ _sub1?: any; _sub2?: any; _sub3?: any; }'
这是我正在使用的界面:
export interface IItem {
_a?: IItem | IItem[];
_b?: IItem | IItem[];
[key: string]: {
_sub1?: any;
_sub2?: any;
_sub3?: boolean;
[key: string]: IItem;
}
}
解决方法
您应该为“固定”键部分和“通用”字符串类型创建一个单独的类型,而不是使用联合&
运算符:
type IItemFixedKeys = {
_a?: IItem | IItem[];
_b?: IItem | IItem[];
}
type IItemGenericKeys = {
[key: string]: {
_sub1?: any;
_sub2?: any;
_sub3?: any;
}
}
export type IItem = IItemFixedKeys & IItemGenericKeys
const x: IItem = {
_a: { // Error: Type '{ _sub1: string; }' is not assignable to type 'IItem | IItem[] | undefined'.
_sub1: 'test'
},_c: { // Works perfectly,because _a is not a 'fixed' key
_sub1: 'test'
}
}
如评论中所述,此解决方案存在一些问题。另一个(更好)的选择是使用conditional types:
type FixedKeys = '_a' | '_b'
type IItem = {
[key: string]: typeof key extends FixedKeys ? IItem | IItem[] : {
_sub1?: any;
_sub2?: any;
_sub3?: boolean;
}
}
,
“ IItem”类型的“ _a”属性IItem [] |未定义”不可分配 字符串索引类型为'{_sub1 ?: any; _sub2 ?:任何; _sub3 ?:任何; }'
您会收到此错误,因为字符串索引“查看”接口的所有字段,因此它们都应为同一类型。示例:
Error: package or namespace load failed for ‘tidyverse’ in dyn.load(file,DLLpath = DLLpath,...):
unable to load shared object '/Library/Frameworks/R.framework/Versions/4.0/Resources/library/Rcpp/libs/Rcpp.so':
dlopen(/Library/Frameworks/R.framework/Versions/4.0/Resources/library/Rcpp/libs/Rcpp.so,6): Symbol not found: _EXTPTR_PTR
Referenced from: /Library/Frameworks/R.framework/Versions/4.0/Resources/library/Rcpp/libs/Rcpp.so
Expected in: /Library/Frameworks/R.framework/Resources/lib/libR.dylib
in /Library/Frameworks/R.framework/Versions/4.0/Resources/library/Rcpp/libs/Rcpp.so
但是如果您将使用数字索引,那么您就没有这样的限制:
export interface IItem {
_a?: IItem | IItem[];
_b?: IItem | IItem[];
[key: string]: IItem | IItem[] | undefined;
}
或:
export interface IItem {
_a?: IItem | IItem[];
_b?: IItem | IItem[];
[key: number]: IItem | IItem[] | undefined;
anotherElement: any;
}
P.S。您刚刚更新了问题,但问题是相同的:
export interface IItem {
_a?: IItem | IItem[];
_b?: IItem | IItem[];
[key: number]: {
_sub1?: any;
_sub2?: any;
_sub3?: any;
}
}
P.P.S。我使用了以下页面:click。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。