Typescript 有没有办法将泛型参数限制为联合类型?为了说明我的意图,下面我假装T extends UnionType将实现这一点:
function doSomethingWithUnion<T extends UnionType>(val: T) {}
doSomethingWithUnion<number | string>(...) // good
doSomethingWithUnion<number>(...) // should result in an error
Run Code Online (Sandbox Code Playgroud)
我在另一个 SO 问题 ( 53953814 ) 中发现,我们可以检查类型是否为联合类型:
type IsUnion<T> = [T] extends [UnionToIntersection<T>] ? false : true
type Foo = IsUnion<string | number> // true
type Bar = IsUnion<string> // false
Run Code Online (Sandbox Code Playgroud)
例如,如果泛型参数不是联合类型,则允许断言函数永远不会返回:
declare function doSomethingWithUnion<T>(val: T): [T] extends [UnionToIntersection<T>] ? never: boolean;
doSomethingWithUnion<number>(2) // never
doSomethingWithUnion<string|number>(2) // => boolean
Run Code Online (Sandbox Code Playgroud)
(链接到操场)
但是,我还没有找到以类似方式约束类型本身的方法。