如何使用提供的参数推断出函数的 return 类型?

How can infer return type of a function using the parameters supplied?

我有一个通用函数,其 return 类型基于输入类型。如何根据提供的参数正确确保 return 类型的类型安全?

例子




interface IKeyboardService{
    type() : void;
}

class KeyboardService{
    type(){
        
    }
}

interface IMouseService{
    move() : void;
}

class MouseService{
    move(){

    }
}

interface ServiceTypeMapping{
    Keyboard: IKeyboardService,
    Mouse: IMouseService
}

type ServiceType = keyof ServiceTypeMapping;

function getService<T extends ServiceTypeMapping, K extends keyof ServiceTypeMapping>(serviceType : K): typeof T[K]{
    switch(serviceType){
        case 'Keyboard':
            return new KeyboardService();
        case 'Mouse':
            return new MouseService();
    }
    throw new Error("No implementation error");
}

//This should be an error
const mouseService = getService('Keyboard');


我正在传递键盘并期待 IKeyboardService。目前,这是 return 类型的 getService 错误。

你可以在这里玩:https://stackblitz.com/edit/typescript-leut1x

谢谢。

您可以使用 overloads:

function getService(serviceType: 'Keyboard'): KeyboardService;
function getService(serviceType: 'Mouse'): MouseService;
function getService(serviceType: keyof ServiceTypeMapping): ServiceTypeMapping[keyof ServiceTypeMapping] {
    switch(serviceType){
        case 'Keyboard':
            return new KeyboardService();
        case 'Mouse':
            return new MouseService();
        default:
            throw new Error("No implementation error");
    }
}

Typescript Playground

您也可以在 return:

上使用条件类型
function getService<T extends ServiceType>(serviceType: T) {
    let returnService
    switch(serviceType){
        case 'Keyboard':
            returnService = new KeyboardService();
            break;
        case 'Mouse':
            returnService = new MouseService();
            break;
        default:
            throw new Error("No implementation error");
    }
    return returnService as T extends 'Keyboard' ? KeyboardService : MouseService
}

Playground