类类型为具有构造函数属性的对象.不强制转换自定义构造函数签名?


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

相关内容

  • 没有找到相关文章

最新更新