基本上就是标题。我试图让 TS 限制作为参数传递的函数的返回类型,使其仅允许对象({x: 42}
),但它却允许任何东西。我已经绞尽脑汁一段时间了,所以我希望有人能告诉我为什么extends object
限制类型是不够的?
type ChainFunction<T, U extends object> = (value: T) => U | Promise<U>;
type Chainable<T> = {
to<U extends object>(fnOrObj: ChainFunction<T, U> | U): Chainable<T & U>;
};
declare function chain<T extends {}>(initialValue: T): Chainable<T>
chain({ a: 1 })
.to(({ a }) => 42) // this should complain that 42 isn't an object
我尝试过其他签名,例如:
type ChainFunction<T, U> = (value: T) => U extends object ? U | Promise<U> : never;
但我无法让任何事情发挥作用。