首页 > 解决方案 > 可选参数的映射类型

问题描述

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

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

我想知道是否有办法指定 args 的类型。参数“二”是可选的。如果用户指定参数“二”,我希望 someFunc 将参数作为数字和字符串,否则除了使用联合类型之外,还有其他方法吗?

谢谢。

标签: typescripttypescript-typings

解决方案


您可以使用联合而不是接口。一个联合成员将two需要一个 if 类型编号,并具有适当的类型 for 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

推荐阅读