class __Constants__ {
[key: string]: string;
constructor(values: string[]) {
values.forEach((key) => {
this[key] = key;
});
}
}
const Constants = __Constants__ as {
new <T extends readonly string[]>(values: T): { [k in T[number]]: k };
};
const __colors__ = ["BLUE", "GREEN"] as const;
const Colors = new Constants(__colors__);
// const Colors: {
// BLUE: "BLUE",
// GREEN: "GREEN",
// }
是否有可能键入__Constants__
类,使其具有与转换相同的返回类型,但不使用自定义构造函数签名?
编辑:请注意,我正在将遗留的JS代码库转换为Typescript,并希望尽可能少地更改JS代码。真正的Constants
类更复杂,这里我已经隔离了我所面临的当前问题。
它是这样工作的:
const Constants = class {
[key: string]: string;
constructor(values: string[]) {
values.forEach((key) => {
this[key] = key;
});
}
} as {
new <T extends readonly string[]>(values: T): { [k in T[number]]: k };
};
const __colors__ = ["BLUE", "GREEN"] as const;
const Colors = new Constants(__colors__);
打印稿操场
它使用了所谓的"类表达式">
编辑:我已经尝试了其他方法。为什么不直接使用函数而不是类呢?如此:
function Constants<T extends readonly string[]>(values: T): { [k in T[number]]: k } {
const obj: any = {};
values.forEach((key) => {
obj[key] = key;
});
return obj;
}
打印稿操场
当然你必须像调用函数一样调用它,而不是创建一个类实例:
const __colors__ = ["BLUE", "GREEN"] as const;
const Colors = Constants(__colors__); // don't use "new" here