我有一个包含一些默认配置的对象。它的某些值不能静态定义,需要在运行时进行计算。要将这些默认值应用于对象,我将应用任何静态值,并执行和应用任何函数的返回。
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
}
以上接口假定所有属性均为静态值,这是不正确的。
如何键入可能是或不是函数的值?
答案 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
,它将仍然是不确定的。在这种情况下,编译器会认为类型是返回布尔值或布尔值的函数,所以也很奇怪