прекрасно работает в 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#, а не страдай фигнёй.
Обсуждают сегодня