【发布时间】:2020-03-22 09:49:41
【问题描述】:
我想键入一个返回两种不同类型之一的函数,具体取决于是否在选项对象中传递了标志。
这是 TypeScript 抱怨的尝试:
type Opts = { two?: boolean }
type LogFn<O> = O extends { two?: true }
? (a: string, b: string) => any
: (a: string) => any
function log(opts: Opts = {}): LogFn<Opts> {
if (opts.two) {
// Type '(a: any, b: any) => void' is not assignable to type
// '(a: string) => any'.(2322)
return (a, b) => { console.log("two: ", a, b) }
} else {
return (a) => { console.log("one: ", a) }
}
}
const one = log()
const two = log({ two: true })
one("x")
// Expected 1 arguments, but got 2.(2554)
two("y", "z")
似乎O extends { two?: true} 表达式总是错误的。但是表达式{ two: true} extends { two?: true} 始终为真,如果我玩弄空对象和假值,则它们的行为应该如此。但它不适用于我需要的泛型变量。
【问题讨论】:
-
我建议不要将类型参数命名为与其他类型相同。
-
@kaya3 谢谢!我已经更新了我的代码示例,以不同的方式命名它,同时也与下面的答案保持一致。
标签: typescript typescript-typings typescript-generics