基于从对象数组中拾取的值的动态Typescript类型



我正在尝试创建一个基于对象数组的键值的动态类型:

type MeasureDeclaration = Array<{ name: string }>;
abstract class Decoder {
public measures: MeasureDeclaration;
addMeasure (measureName: T) {
}
}
class TempDecoder extends Decoder {
constructor () {
super();
this.measures = [
{ name: 'temperature' },
{ name: 'battery' },
];
}
}
const tempDecoder = new TempDecoder();
// OK
tempDecoder.addMeasure('temperature');
// KO
tempDecoder.addMeasure('humidity');

在普通的Javascript中,我会做一些类似measureName: MeasuresDeclaration.map(elem => elem.name)的事情,但在Typescript中我真的很难理解如何实现这一点。

有人给了我答案(谢谢Jean和Paul!(

type MeasureDeclaration<T = string> = ReadonlyArray<{ name: T }>;
class DecodedPayload<T extends Decoder> {
public decoder: T;
constructor(decoder: T) {
this.decoder = decoder;
}
addMeasure(measureName: T["measures"][number]["name"]) {
// ...
}
}
abstract class Decoder {
public measures: MeasureDeclaration = [];
abstract decode (): DecodedPayload<Decoder>;
}
class TempDecoder extends Decoder {
public measures = [
{ name: 'temperature' },
{ name: 'battery' },
] as const;
constructor () {
super();
}
decode (): DecodedPayload<Decoder> {
const decodedPayload = new DecodedPayload<TempDecoder>(this);
// OK
decodedPayload.addMeasure('temperature');
// @ts-expect-error
decodedPayload.addMeasure('humidity');
return decodedPayload;
}
}

最新更新