Javascript TypeScript:如何为代理对象上的值创建键入?
我试图让getter返回对象中正确类型的键。起初,我让getter返回Javascript TypeScript:如何为代理对象上的值创建键入?,javascript,typescript,Javascript,Typescript,我试图让getter返回对象中正确类型的键。起初,我让getter返回{[key:string]:any},它可以工作,但没有与对象中的项关联的类型 class a { private static _scope: { [key: string]: any } public static get scope(): { [key: string]: typeof key } { if(!a._scope){ a._scope = a.createProxy()
{[key:string]:any}
,它可以工作,但没有与对象中的项关联的类型
class a {
private static _scope: { [key: string]: any }
public static get scope(): { [key: string]: typeof key } {
if(!a._scope){
a._scope = a.createProxy()
}
return a._scope
// returns a proxy object
// example:
// {
// a: 999,
// b: [1,2,3]
// }
}
}
a.scope.a = 999
a.scope.b = [1,2,3]
a.scope.c = 'Spider-Man'
因此,在上面的代码中,我希望实现的是,当我键入a.scope.a.
时,它会知道值是一个数字。然后,当我键入a.scope.b.
时,它将知道该值是一个数组
在上面的例子中,我发现一切都是一个字符串,我明白为什么。我不知道(或者如果可能的话)的是让它知道值的类型
项目是动态添加到对象中的,因此我不知道对象中有哪些键或它们的类型,因此使用带有预定义键的类型
或接口
无法正常工作
项目是动态添加到对象中的,所以我不知道对象中有哪些键或它们的类型
在这种情况下,编译器也无法知道
您可以使用一个(不包括在打字脚本中)来给您一些安全性
但是,让我来强调一下,你“不知道什么键或类型”的想法是提前的。事实上,在您发布的示例中,您似乎知道a.scope
应该像{a:number;b:number[];c:string;}
。这就是为什么你要求编译器帮助你。可能在类/实例级别上不知道该类型结构,但在某个时候它是已知的,这就是为什么要针对它编写代码。这可能是一个很好的例子
也许您的示例可以如下所示:
class A<TScope> {
private _scope: TScope;
public get scope(): TScope {
if (!this._scope) {
this._scope = this.createProxy()
}
return this._scope;
}
}
type MyScope = { a: number; b: number[]; c: string; }
const a = new A<MyScope>();
a.scope.a = 999;
a.scope.b = [1, 2, 3];
a.scope.c = 'Spider-Man';
项目是动态添加到对象中的,所以我不知道对象中有哪些键或它们的类型
在这种情况下,编译器也无法知道
您可以使用一个(不包括在打字脚本中)来给您一些安全性
但是,让我来强调一下,你“不知道什么键或类型”的想法是提前的。事实上,在您发布的示例中,您似乎知道a.scope
应该像{a:number;b:number[];c:string;}
。这就是为什么你要求编译器帮助你。可能在类/实例级别上不知道该类型结构,但在某个时候它是已知的,这就是为什么要针对它编写代码。这可能是一个很好的例子
也许您的示例可以如下所示:
class A<TScope> {
private _scope: TScope;
public get scope(): TScope {
if (!this._scope) {
this._scope = this.createProxy()
}
return this._scope;
}
}
type MyScope = { a: number; b: number[]; c: string; }
const a = new A<MyScope>();
a.scope.a = 999;
a.scope.b = [1, 2, 3];
a.scope.c = 'Spider-Man';
你能给像这样的东西一个现实生活的需要吗?我有一个双向装订的图书馆。每当
作用域
更改时,如果代理正在侦听a
、b
、c
或作用域中的任何内容,则代理会告诉html更改值
或文本内容
。您可以创建一个类型,跟踪添加到其中的属性,但如果直到运行时才知道这些属性,我看不出你能得到多少工具。你能给像这样的东西一个现实生活的需要吗?我有一个双向绑定库。每当作用域
更改时,如果代理正在侦听a
、b
、c
或作用域中的任何内容,则代理会告诉html更改值
或文本内容
。您可以创建一个类型,跟踪添加到其中的属性,但如果直到运行时才知道这些属性,我看不出你能得到多少工具。我们不知道物体上存在a、b或c。这些只是在运行时添加的值的示例。那么,您的示例是错误的,因为您编写了针对a
、b
和c
的代码,并希望它们具有类型number
、number[]
和string
。您是在迭代键还是什么?在我的代理中,我有proxy.set
,我可以获得更改的属性,然后我可以在domquerySelectorAll(“[data bind]”)中获得一个项目列表,如果它与属性匹配,我更新了dom元素。我想你需要用一个你如何实际使用代理的例子来更新你的问题。正如目前所写的,它似乎并没有真正反映您的问题。我们不知道对象上是否存在a、b或c。这些只是在运行时添加的值的示例。那么,您的示例是错误的,因为您编写了针对a
、b
和c
的代码,并希望它们具有类型number
、number[]
和string
。您是在迭代键还是什么?在我的代理中,我有proxy.set
,我可以获得更改的属性,然后我可以在domquerySelectorAll(“[data bind]”)中获得一个项目列表,如果它与属性匹配,我更新了dom元素。我想你需要用一个你如何实际使用代理的例子来更新你的问题。正如目前所写的,它似乎并没有真正反映出你的问题。