Есть ли способ использовать условный тип 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
}