簡體   English   中英

如何以正確的方式在對象上動態設置屬性?

[英]How can I dynamically set a property on an object in right way?

我正在使用Typescript 我想知道如何在對象上動態設置屬性,以便Typescript識別分配。

例如,

class Foo {
    constructor(obj: object) {
        for (const key in obj) {
            this[key] = obj[key]
        }
    }
}

const bar = new Foo({
    x: 1,
    y: 2,
});

bar.x; // Property 'x' does not exist on type 'Foo'

我正在嘗試做的是:

class State {
    private state: string;

    constructor (states: string[]) {
        states.forEach((x) => {
            this[x] = () => this.state = x;
        });
    }
}

const x = new State(['open', 'closed']);

x.open(); // Property 'open' does not exist on type 'State'.

嗯,我認為TypeScript並不是靜態類擴展通用類型的好方法。 我的意思是,以下無效的 TypeScript符合您的要求:

// doesn't work
class Foo<T> extends T {
  constructor(obj: T) {
    for (const key in obj) {
      this[key] = obj[key];
    }
  }
}

因此,您需要一個諸如 mixin類的類 ,在其中您可以將Foo擴展為FooT的構造函數,但又不完全是。 這是我能做的最好的事情:

創建一個具有不同名稱_Foo的類, _Foo將添加所有特定於Foo方法和屬性。 請注意,您必須斷言thisT類型,以便為其分配T的屬性:

class _Foo<T> {
  constructor(obj: T) {
    for (const key in obj) {
      // assert this to be compatible with T
      (this as any as T)[key] = obj[key];
    }
  }
  // Foo-specific properties and methods go here
}

然后可以將類型Foo<T>定義為_Foo<T>T ,並斷言Foo還是充當Foo<T>的構造函數的對象:

type Foo<T> = T & _Foo<T>;
const Foo = _Foo as { new <T>(obj: T): Foo<T> };

現在使用它:

const bar = new Foo({
  x: 1,
  y: 2,
});

bar.x; // okay

那對你有用嗎? 可能值得一提的是,此處涉及的困難可能表明您嘗試執行的操作可能會通過另一種設計在TypeScript中更好地實現。 例如,也許Foo<T>應該只是一個T ,而不是一個。 然后,您可以以更直接的方式執行此操作。 但這取決於你。

希望能幫助到你; 祝好運!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM