Тип Аргументы, Ограничивающие Не Обнуляемый <T> - PullRequest
0 голосов
/ 25 февраля 2020

Есть ли способ использовать условный тип NonNullable<T> внутри блока объявления T, получая тот же результат, что и функция ниже? Или более простой способ получить тот же результат?


function logObj<
  T extends string | boolean | string | object | ((...args: any) => any)
>(obj: T) {
  console.log(obj);
}

logObj({});
logObj("");
logObj({ foo: "foo" });
//logObj(null); // proper compilation error
//logObj(undefined); // proper compilation error

Я попробовал подход ниже, но он не компилируется.


namespace CompilationError {
  //                        Compilation Error: Type parameter 'T' has a circular constraint.
  //                        ↓
  function logObj<T extends NonNullable<T>>(obj: T) {
    console.log(obj);
  }

  logObj({});
  logObj("");
  logObj({ foo: "foo" });
  //logObj(null); // proper compilation error
  //logObj(undefined); // proper compilation error
}

Решения ниже работает, но я бы хотел хотел бы использовать ограничение типа сразу после объявления параметра типа.


namespace NonNullableInsideArgumentType {
  function logObj<T>(obj: NonNullable<T>) {
    console.log(obj);
  }
  logObj({});
  logObj("");
  logObj({ foo: "foo" });
  //logObj(null); // proper compilation error
  //logObj(undefined); // proper compilation error
}


namespace NonNullableUsingUnionTypes {
  function logObj<T extends NonNullable<string | boolean | string | object | ((...args: any) => any)>>(obj: T) {
    console.log(obj);
  }

  logObj({});
  logObj("");
  logObj({ foo: "foo" });
  //logObj(null); // proper compilation error
  //logObj(undefined); // proper compilation error
}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...