从数组创建计算的 class 属性

Creating computed class properties from array

我有一个字符串文字数组,我想将其用作 class 的 属性 名称。

const propNames = ["a", "b", "c"] as const;

我想创建一个class喜欢

class Test {
    [name in typeof propNames[number]]: any;
}

但这给出了错误(在 WebStorm 检查中):

TS1166: A computed property name in a class property declaration must refer to an expression whose type is a literal type or a 'unique symbol' type.
TS2464: A computed property name must be of type 'string', 'number', 'symbol', or 'any'.
TS2361: The right-hand side of an 'in' expression must be of type 'any', an object type or a type parameter.
TS2693: 'number' only refers to a type, but is being used as a value here.

我可以用

这样的属性定义一个类型
type Test = {
    [name in typeof propNames[number]]: any;
}

但我不知道如何将它变成具有这些属性的 class。

我有一个额外的问题,我认为目前不可能,但我可以通过将另一个字符串文字连接到它们来创建这些 属性 名称吗?

type Test = {
    [name + 'Prop' in typeof propNames[number]]: any;
}

为什么不定义一个类型,然后通过以下方式使用它:

type Test = {
    [key: TEST]: any;
} 

其中 TEST 是类型。我从来没有冒险这样做过,但我知道它适用于原始类型。

希望它能带你去你想去的地方!

我通过定义中间类型并像命名空间一样使用它们来解决这个问题(包括额外的问题):

const propNames = ["a", "b", "c"] as const;

// using DOM types for demonstration
type Canvases {
    [name in typeof propNames[number]]?: HTMLCanvasElement;
}
type Contexts {
    [name in typeof propNames[number]]?: CanvasRenderingContext2D;
}

// define class
class Test {
    canvases: Canvases = {};
    ctxs: Contexts = {};
}

// now access on instances
const t = new Test();
t.canvases.a; // HTMLCanvasElement
t.ctxs.b;     // CanvasRenderingContext2D