简体   繁体   中英

How to infer a method return type from an enum input with Typescript?

I have an AudioProcessor enum:

export enum AudioProcessors {
  BiquadFilter = 'BiquadFilter',
  StereoPanner = 'StereoPanner',
  DynamicsCompressor = 'Dynamics​Compressor​',
  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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM