1

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

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
}

上面的接口假设所有的属性都是静态值,这是不正确的。

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

4

1 回答 1

2

要使属性具有两种(或更多)不同的类型,您可以使用联合运算符

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;
}

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

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,它仍然是模棱两可的。在这种情况下,编译器会认为该类型是一个返回布尔值或布尔值的函数,所以这也很奇怪

于 2020-07-13T07:54:27.297 回答