Javascript TypeScript:如何为代理对象上的值创建键入?

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()

我试图让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()
    }
    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
,我可以获得更改的属性,然后我可以在dom
querySelectorAll(“[data bind]”)中获得一个项目列表
,如果它与属性匹配,我更新了dom元素。我想你需要用一个你如何实际使用代理的例子来更新你的问题。正如目前所写的,它似乎并没有真正反映您的问题。我们不知道对象上是否存在a、b或c。这些只是在运行时添加的值的示例。那么,您的示例是错误的,因为您编写了针对
a
b
c
的代码,并希望它们具有类型
number
number[]
string
。您是在迭代键还是什么?在我的代理中,我有
proxy.set
,我可以获得更改的属性,然后我可以在dom
querySelectorAll(“[data bind]”)中获得一个项目列表
,如果它与属性匹配,我更新了dom元素。我想你需要用一个你如何实际使用代理的例子来更新你的问题。正如目前所写的,它似乎并没有真正反映出你的问题。