如何使用提供的参数推断出函数的 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");
}
}
您也可以在 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
}
我有一个通用函数,其 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");
}
}
您也可以在 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
}