Я пытаюсь сделать следующее (также увидеть его на площадке TypeScript ), но я получаю сообщение об ошибке в возвращаемом типе функции, которое говорит мне, что условный тип не может быть назначен объединению :
type RequestType =
| 'foo'
| 'bar'
| 'baz'
interface SomeRequest {
id: string
type: RequestType
sessionId: string
bucket: string
params: Array<any>
}
type ResponseResult = string | number | boolean
async function sendWorkRequest<T extends RequestType>(
type: T,
...params
): Promise<
T extends 'foo'
? string
: T extends 'bar'
? number
: T extends 'baz' ? boolean : never
> {
await this.readyDeferred.promise
const request: SomeRequest = {
id: 'abc',
bucket: 'bucket',
type,
sessionId: 'some session id',
params: [1,'two',3],
}
const p = new Promise<ResponseResult>((/*...*/) => {/*...*/})
this.requests[request.id] = p
this.worker.postMessage(request)
return p // <-------------------------------- ERROR
}
По сути, я хочу, чтобы условный тип приводил к одному из типов ResponseResult
. Таким образом, основываясь на аргументе type
, переданном в функцию, он должен вернуть один из типов в объединении ResponseResult
(как обещание).
Как я могу заставить эту работу работать, чтобы тип аргумента type
определял тип возвращаемого Promise?
Вот другой способ сделать это без условных типов, но я хочу знать, можно ли это сделать, используя условный тип для type
аргумента.
РЕДАКТИРОВАТЬ: Основываясь на ответе Эрика ниже, мне также любопытно, почему этот не будет работать, и если возможно заставить его работать без переопределения ResponseResult
и без изменения типа возврата функция.
@ Эрик, второй пример .