为类型或返回类型的函数编写接口

时间:2020-07-13 06:11:43

标签: typescript typescript-types dynamic-values

我有一个包含一些默认配置的对象。它的某些值不能静态定义,需要在运行时进行计算。要将这些默认值应用于对象,我将应用任何静态值,并执行和应用任何函数的返回。

const SETTINGS = {
  prop1: true,
  prop2: (config: Config): boolean => config.prop2,
  prop3: (config: Config): number => config.prop2,
  prop4: 0,
} as DefaultSettings

为此对象编写接口很困难。任何给定的属性可以是一个静态值,也可以是一个返回值的函数。我希望接口能够表示这种类型的多个对象,其中属性名称和属性类型相同,但是任何属性都可以是值或函数。

interface DefaultSettings {
  prop1: boolean
  prop2: boolean
  prop3: number
  prop4: number
}

以上接口假定所有属性均为静态值,这是不正确的。

如何键入可能是或不是函数的值?

1 个答案:

答案 0 :(得分:2)

要使一个属性具有两种(或更多)不同的类型,可以使用https://dev.schandillia.com/graphql

interface DefaultSettings {
  prop1: boolean | ((config: Config) => boolean);
  prop2: boolean | ((config: Config) => boolean);
  prop3: number;
  prop4: number;
}

为了不重复自己,您也可以为此创建一个类型:

type ConfigBoolean = boolean | ((config: Config) => boolean);

interface DefaultSettings {
  prop1: ConfigBoolean;
  prop2: ConfigBoolean;
  prop3: number;
  prop4: number;
}

通过使用泛型,您甚至可以走得更远。例如,如果number也可以是原语或返回该原语的函数:

type ConfigType<T> = T | ((config: Config) => T);

interface DefaultSettings {
 prop1: ConfigType<boolean>;
 prop2: ConfigType<boolean>;
 prop3: ConfigType<number>;
 prop4: ConfigType<number>;
}

必须在函数类型两边加上括号,否则编译器会认为:boolean | (config: Config),然后感到困惑:)。如果您将其转回:(config: Config) => boolean | boolean,它将仍然是不确定的。在这种情况下,编译器会认为类型是返回布尔值或布尔值的函数,所以也很奇怪