網站搜尋

javascript - 如何定義具有動態鍵的類?


我需要定義一個具有像 'Methods' 這樣動態屬性的類。我寫了這個

type Methods = {
    [name:string]:Function
}

class App <M extends Methods> { 
    [name: keyof M] : M[name] // dont work
}

var methods = {
    action : Function,
    move : Function
}

type M = keyof typeof methods;

type myApp = App<typeof methods>;

但是我收到以下錯誤。這些可以修復嗎?

索引簽名的參數類型不能是字面量類型或泛型類型。請考慮改用映射物件類型。

「name」指的是一個值,但在這裡被用作類型。你是想用「typeof name」嗎?

從匯出的介面回傳的索引簽名類型具有或正在使用私有名稱 'name'。

可重現的範例

答案#1

你似乎在尋找映射類型。但它們僅適用於 type 聲明,而不適用於 class:

type App<M extends Methods> = { 
    [name in keyof M]: M[name];
}

(完整演示)

如果你真的想定義一個類,你需要用具體的類型來定義它:

var methods = {
    action: Function,
    move: Function
}
type MyApp = App<typeof methods>;

class TheApp implements MyApp {
    action!: typeof Function;
    move!: typeof Function;
    constructor() {
        Object.assign(this, methods);
    }
}