让我们定义基础知识:
type Primitive = boolean | number | string | symbol | null | undefined;
class Foo<T> {
constructor(value: T | (T extends Function ? never : T)) {}
}
new Foo(() => 1)
new Foo(1)
如果我们定义
isPrimitive
和
isObject
像这样的:
declare function isPrimitive(argument: unknown): argument is Primitive;
declare function isObject<T extends object>(argument: T | Primitive): argument is T;
我们在调用站点得到了正确的类型推断:
function testPrimitive(argument: unknown) {
if (isPrimitive(argument)) {
return new Foo(argument);
}
}
function testObject<T extends object>(argument: T | Primitive) {
if (isObject(argument)) {
return new Foo(argument);
}
}
Playground