强制泛型函数参数为
T | null
,因此只能传递包含 T | null
类型的值:
function foo<T>(val: T) { ... }
let fooNonNullish: string = "foo"
foo(fooNonNullish) // should not compile because string cannot be null
let fooNullish: string | null = "foo";
foo(fooNullish) // should compile
检查联合
T | null
是否扩展了类型 T
似乎创建了所需的行为:
type Nullish<T> = T | null extends T ? T : never;
function foo<T>(val: Nullish<T>) { console.log(val); }
let fooNonNullish: string = "foo"
foo(fooNonNullish); // Error
let fooNullish: string | null = Math.random() > .5 ? "foo" : null;
foo(fooNullish) // OK
请注意,我必须在
fooNullish
变量的初始化中包含一个随机因子,以防止 TypeScript 急切地将参数缩小到 string
。