【问题标题】:Mapped Type For Optional Arguments可选参数的映射类型
【发布时间】:2019-04-21 10:28:54
【问题描述】:
interface Foo{
one: string;
two?: number;
someFunc: (args: string|number) => string
}
所以,我正在寻找一种声明“args”类型的方法;
我想知道是否有办法指定 args 的类型。参数“二”是可选的。如果用户指定参数“二”,我希望 someFunc 将 args 作为数字和字符串,否则除了使用联合类型之外,还有其他方法吗?
谢谢。
【问题讨论】:
标签:
typescript
typescript-typings
【解决方案1】:
你想要:
type Foo =
| {one: string, two: number, someFunc(args: string): string}
| {one: string, someFunc(args: number): string}
【解决方案2】:
您可以使用联合来代替接口。一个联合成员将具有two 所需的if 类型编号,并具有args 的适当类型,联合的另一个成员将具有twooptional 和never 类型,以确保其与另一个不兼容工会会员。您将对参数类型进行推理,但编译器将验证函数是否具有适当的参数类型。
type Foo = {
one: string;
two?: never;
someFunc: (args: number) => string
} | {
one: string;
two: number;
someFunc: (args: string) => string
}
let foo: Foo = {
one: '',
someFunc : (a: string) => a
} // err
let foo2: Foo = {
one: '',
someFunc : (a: number) => a.toString()
} // ok
let foo3: Foo = {
one: '',
two:2,
someFunc : (a: string) => a
} // ok
let foo4: Foo = {
one: '',
two:3
someFunc : (a: number) => a.toString()
} // err