问题描述
我目前有一个使用其他接口类型数组的数据成员的接口,该接口可以由枚举确定:
enum E { a,b,c }
interface E2Data {
[E.a]: { a: string },[E.b]: { b: string },[E.c]: { c: string }
}
interface A<T extends E[] = E[]> {
data: { [i in keyof T]: T[i] extends E ? E2Data[T[i]] : never }
}
// Can give the enums in the template,and get autocomplete in the data.
let a1: A<[E.a,E.b]> = {
data: [{ a: "" },{ b: "" }]
};
// Or can get autocomplete with type assertion on elements.
// Ideally this would infer template types too,but apparently not.
let a2: A = {
data: [ <E2Data[E.a]>{ a: "" },<E2Data[E.b]>{ b: "" } ]
}
根据我的理解,我现在可以将a1.data
和a2.data
用作数组,但是a1.data
知道每个元素的类型(实际上是元组吗?)
现在,我想对interface A
的数据使用2D数组。
我认为下面的方法可以工作,但是不允许我使用E2Data
为T[i][j]
编制索引。
interface B<T extends E[][] = E[][]> {
data: {
[i in keyof T]:
T[i] extends E[] ? {
[j in keyof T[i]]:
T[i][j] extends E ? E2Data[T[i][j]] : never }
// ^^^^^^^^^^^^^^^
// Type 'T[i][j]' cannot be used to index type 'E2Data'.
: never
}
}
我当前的解决方法是使用类型联合,但这不能让我使用模板指定想要的数据。
interface B {
data: (E2Data[E.a] | E2Data[E.b] | E2Data[E.c])[][];
}
对于2D数组,是否有一种方法可以支持data
上的两种自动完成方法?
let b1: A<[ [E.a],[E.b] ]> = {
data: [ [{ a: "" }],[{ b: "" }] ]
}
let b2: A = {
data: [ [<E2Data[E.a]>{ a: "" }],[ <E2Data[E.b]>{ b: "" }] ]
}
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)