Я пытаюсь объединить 2 отдельных метода Typescript в один с тем же именем getDevice
. Первая функция требует только числа, чтобы вернуть Device
или null
в случае отсутствия устройства:
protected getDevice(deviceId: number): Device | null {
const device = this.devicesService.getDevice(deviceId);
if (device == null)
console.warn(`Failed to get the device #${deviceId}.`);
return device;
}
Вторая функция принимает 2 аргумента. Первый - это либо число (как в предыдущей функции), либо Device
(результат предыдущей функции):
protected getDeviceAs<T extends DeviceType>(
deviceOrId: Device | number,
deviceType: (new (device: Device) => T),
): T | null {
const device = typeof deviceOrId === 'number'
? this.devicesService.getDevice(deviceOrId)
: deviceOrId as Device;
if (device == null) {
console.warn(`Failed to get the device #${deviceOrId}.`);
return null;
}
return new deviceType(device);
}
Результат объединения двух методов будет примерно таким:
protected getDevice<T extends DeviceType>(
deviceOrId: Device | number,
deviceType: (new (device: Device) => T) | null = null,
): Device | T | null {
let device: Device | null = null;
// In case deviceOrId is a number
if (typeof deviceOrId === 'number') {
device = this.devicesService.getDevice(deviceOrId);
if (device == null) {
console.warn(`Failed to get the device #${deviceOrId}.`);
return null;
}
if (deviceType == null) return device;
}
// getDeviceAs functionality
return new deviceType(device);
}
Проблема в том, что я не могу понять, как правильно набрать всю функцию:
- return type depends on the
deviceOrId
argument type:- if
deviceOrId
is aDevice
, then for sure the result must beT | null
- если
deviceOrId
- этоnumber
, то это может бытьDevice | T | null
- if
- return type and
deviceOrId
depend on thedeviceType
argument:- if
deviceType
is anull
then thedeviceOrId
must be of typenumber
and return type ofDevice | null
- если
deviceType
- это(new (device: Device) => T)
, то тип возврата должен бытьT | null
- if
Возможно ли это вообще в Машинописи? Если да, то как? Может быть, с какими-то уловками с перегрузкой функций?