【发布时间】:2019-12-24 11:37:43
【问题描述】:
我想将myG 传递给Foo 并获得Foo.get 和OBJ/KEY_OF_OBJ 构造函数arg 的完成(在vscode 中),我可以让它工作以便我得到Foo.get 或 OBJ/KEY_OF_OBJ 的完成,但不是同时完成。
interface G {
[key: string]: string;
}
interface GE<T extends G> {
[key: string]: T;
}
class Foo<T extends G, K extends GE<T>> {
constructor(OBJ: K, KEY_OF_OBJ: keyof K) {}
get(keyOfG: keyof T) {}
}
interface myG extends G {
d: string;
e: string;
}
const foo = new Foo<myG>(
{
a: {
d: '',
e: ''
},
c: {
d: '',
e: ''
}
},
'c'
);
foo.get('');
编辑:
必须像这样声明Foo new Foo<myG, {a: myG, c: myG}> 也是可以接受的,我这样声明它的唯一问题是,Foo.get 没有自动完成,这是因为 ts 认为它是一个字符串,如果我删除 @ 987654335@,它可以工作,但我希望 T 有 key: stringValue 对,我想我的问题已经解决了,除非有办法将 T 限制为只有字符串值。
【问题讨论】:
-
这里发生了很多事情,每一个都可能是它自己的问题。首先:您似乎想指定
T泛型类型参数,同时让编译器在您调用new Foo<myG>(....)时推断K泛型类型参数。但是 TypeScript 不支持这种类型参数的部分推断,所以you'd need to use a workaround for it。续: -
另一个问题是你有一个
string | "d" | "e"类型的值并且你希望编译器自动完成"d"和"e"...但当然string | "d" | "e"只是string并且编译器在建议完成时忘记了所有关于"d"和"e"的信息。这是an open issue,也有解决方法。您在问题中问的是两个问题中的哪一个?
标签: typescript