I have an AudioProcessor enum:
export enum AudioProcessors {
BiquadFilter = 'BiquadFilter',
StereoPanner = 'StereoPanner',
DynamicsCompressor = 'DynamicsCompressor',
None = 'None'
}
and a AudioProcessorNode type:
export type AudioProcessorNode = BiquadFilterNode | StereoPannerNode | DynamicsCompressorNode;
I want to make a class method that takes the enum and returns the correspond Node (from some class properties) but I am not sure how to make Typescript infer the type so that:
public getProcessor(audioProcessor: AudioProcessors): AudioProcessorNode {
throw new Error(`Method not implemented. ${audioProcessor}`);
}
audioClass.getProcessor(AudioProcessors.BiquadFilter) // returns BiquadFilterNode
Looks like what I need is something like ReturnType but I do not know how to put it in my method signature.
You could use overloads to make the method return the appropriate type:
public getProcessor(audioProcessor: AudioProcessors.BiquadFilter): BiquadFilterNode
public getProcessor(audioProcessor: AudioProcessors.DynamicsCompressor): DynamicsCompressorNode
public getProcessor(audioProcessor: AudioProcessors.StereoPanner): StereoPannerNode
public getProcessor(audioProcessor: AudioProcessors): AudioProcessorNode {
throw new Error(`Method not implemented. ${audioProcessor}`);
}
Or you can use a mapping interface from the enum members to the appropriate return types:
interface AudioProcessorNodeMap {
[AudioProcessors.BiquadFilter] : BiquadFilterNode;
[AudioProcessors.DynamicsCompressor] : DynamicsCompressorNode;
[AudioProcessors.StereoPanner] : StereoPannerNode;
[AudioProcessors.None] : void;
}
class x{
public getProcessor<T extends AudioProcessors>(audioProcessor: T): AudioProcessorNodeMap[T]
public getProcessor(audioProcessor: AudioProcessors): AudioProcessorNode {
throw new Error(`Method not implemented. ${audioProcessor}`);
}
}
The advantage f this version is if you forget to add a member in the interface you will get an error on the method.
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.