【问题标题】:Writing an interface for type, or function that returns type为类型或返回类型的函数编写接口
【发布时间】:2020-11-02 07:29:02
【问题描述】:

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

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
}

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

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

【问题讨论】:

  • 你的意思是像prop2: boolean | (config: Config) => boolean这样的吗?
  • @PoulKruijt 这就是我的意思,是的——尽管使用它的字面意思是Member 'boolean' implicitly has an 'any' type.
  • 您能否详细说明上述建议有什么问题? typescriptlang.org/play/index.html#code/…
  • @AlekseyL。我没有将函数包装在额外的括号中,这会导致 Typescript 将其解释为文字箭头函数。这种方法有效!谢谢你。你知道我可以在文档中的哪里找到这个功能吗?
  • 不,抱歉,在文档中也找不到这个

标签: typescript typescript-types dynamic-values


【解决方案1】:

要使属性具有两种(或更多)不同的类型,您可以使用union operator

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

【讨论】:

    猜你喜欢
    • 2011-02-10
    • 2019-01-15
    • 1970-01-01
    • 2018-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多