прекрасно работает в JS:
const test = param => param === undefined ? "string" : test
test(1)()
test(1)(2)()
test(1)(2)(3)()
я ЗНАЮ, что test возвращает string ТОЛЬКО в случае, если параметр не передан
Теперь хочу СТРОГУЮ типизацию для test в TS. Я пытаюсь делать так:
type CaseWithoutParam = () => string
type CaseWithParam = (param: number) => CaseWithParam | CaseWithoutParam
const test: CaseWithParam | CaseWithoutParam
Но компилятор ругается с такими ошибками:
первая при типизации test:
Type '(param: number) => CaseWithParam | CaseWithoutParam | "string"' is not assignable to type 'CaseWithParam | CaseWithoutParam'.
Type '(param: number) => CaseWithParam | CaseWithoutParam | "string"' is not assignable to type 'CaseWithParam'.
Type 'CaseWithParam | CaseWithoutParam | "string"' is not assignable to type 'CaseWithParam | CaseWithoutParam'.
Type '"string"' is not assignable to type 'CaseWithParam | CaseWithoutParam'
вторая - при вызове test:
Cannot invoke an expression whose type lacks a call signature. Type 'string | CaseWithParam | CaseWithoutParam' has no compatible call signatures.
Теоретически, это же ведь должно быть возможно. Возможно ли это в TS? (может infer или другие фичи conditional types?)
въёби тернар (с)
function test<T>(param: T): T extends undefined ? string : typeof test { return param === undefined ? 'string' : test; }; что-то типа такого
лучше спросить в более профильном месте: https://t.me/ts_ru тут можно только набросить: тс - костыль, нечего прикурчивать типы к динамическому языку, ты на беке, нужны типы бери какой-нибудь C#, а не страдай фигнёй.
Обсуждают сегодня