可选参数的映射类型

时间:2018-11-19 04:19:18

标签: typescript typescript-typings

interface Foo{
  one: string;
  two?: number;
  someFunc: (args: string|number) => string
}

所以,我正在寻找一种声明'args'类型的方法;

我想知道是否有一种方法可以指定args的类型。参数'two'是可选的。如果用户指定参数“ two”,则我希望someFunc将args用作数字和字符串,否则,除了联合类型之外,还有其他方法可以做到这一点。

谢谢。

2 个答案:

答案 0 :(得分:2)

您要

type Foo =
  | {one: string, two: number, someFunc(args: string): string}
  | {one: string, someFunc(args: number): string}

答案 1 :(得分:2)

您可以使用联合而不是接口。一个工会成员将拥有two所需的if类型编号,并具有适用于args的类型,工会的另一名成员将具有two可选且类型为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