typescript - 获取复杂类型的补全
问题描述
我想为 /构造函数 argmyG
传递Foo
并获得完成(在 vscode 中),我可以让它工作,以便我获得或/的完成,但不是同时完成。Foo.get
OBJ
KEY_OF_OBJ
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 认为它是一个字符串的东西,如果我删除G
,它可以工作,但我T
想有key: stringValue
对,我想我的问题已经解决了,除非有办法限制T
只有字符串值。
解决方案
我将假设您可以Foo
通过手动指定类型参数T
和K
泛型类型参数来构造实例:
const foo = new Foo<myG, { a: myG, c: myG }>(
{
a: { d: "", e: "" },
c: { d: "", e: "" }
}, "c"
);
所以你的问题是:当索引签名吸收并进入它时,我们如何在我们的 IDE 中为已知的文字键"d"
和"e"
of自动完成?也就是说,既然评估为 just ,我们如何让 IDE “记住” and ?myG
string
"d"
"e"
"d" | "e" | string
string
"d"
"e"
关于这个有一个未解决的问题(Microsoft/TypeScript#33471),所以还没有简单而明显的答案。有哪些复杂和/或不明显的答案?这是一个。
首先,使用现有解决方案从具有索引签名的类型中获取已知的文字键:
type KnownKeys<T> = {
[K in keyof T]: string extends K ? never : number extends K ? never : K
} extends { [_ in keyof T]: infer U } ? U : never;
让我们验证它是否正确myG
:
type KnownKeysOfMyG = KnownKeys<myG>
// type KnownKeysOfMyG = "d" | "e"
看起来不错。现在,我们可以将get()
签名更改Foo
为 accept KnownKeys<T>
:
get(keyOfG: Extract<KnownKeys<T>, string>): void;
如果我们仍然想接受任意string
值get()
,这里的解决方法是为该接受添加第二个重载签名:get()
string
get(keyOfG: Extract<KnownKeys<T>, string>): void;
get(keyOfG: string): void;
get(keyofG: string) {
// impl
}
它仍然接受所有string
值:
foo.get(""); // okay
foo.get("d"); // okay
foo.get("e"); // okay
foo.get("fkjksjfksjfkds"); // okay
但是自动完成提示现在起作用了:
好的,希望有帮助;祝你好运!
推荐阅读
- node.js - 无法对 js 文件中的按钮操作使用异步方法
- angular - 为嵌套反应式表单结构中的所有表单对象设置自定义属性
- google-analytics - Google Analytics Reporting API TOS 和缓存
- ffmpeg - H264 片段到图像文件
- amazon-web-services - Redshift Spectrum 如何扫描数据?
- css - (Laravel Mix - 复制目录) - 从scss,less复制到css后如何编译样式文件
- canvas - Canvas API 从路径的最新点断开弧
- oracle - AWS DMS 与 CDC。更新记录只包含更新的字段。如何包括所有?
- python - 如何根据使用 pyhton 的数据框中的值获取函数的公式
- python - 如何过滤数据框中的行?