当前位置: 首页 > 知识库问答 >
问题:

如何使用constans定义对象的通用接口?

桑飞语
2023-03-14

在项目中,我有几个带有字符串常量的对象。例如:

export const Elements: Constants {
    DESCRIPTION: "DescriptionAutoField2",
    FORMULA_CALC: "FormulaCalcAutoField1",
    CHART_CODE: "ChartCodeAutoField1",
    CHART_CODE_DESCRIPTION: "ChartDescriptionAutoField1",
};

export const ChartAttr: Constants = {
    CHART: "Chart",
    CHART_DESCRIPTION: "ChartDescr",
};

export const SliceLink: Constants = {
    SLICE_CODE: "SliceCode",
    SLICE_DESC: "SliceDesc",
    SLICE_CALC: "SliceCalc",
};

我这样定义了接口,但在这种情况下,在编译过程中无法检查对象kyes。

 export interface Constants {
       [key: string]: string;
 }

我的问题是:如何定义通用接口“常量”,并根据定义的对象属性进行严格编译?可以避免“枚举”吗?

共有1个答案

支铭晨
2023-03-14

没有像常量这样的单一具体类型可以匹配所有元素图表属性切片链接,同时记住每个元素的确切键和值。相反,您可以表示与约束匹配的泛型类型,并使用辅助函数确保值符合它,同时输出记住单个键/值类型的强类型值:

// helper function
const asConstants = <S extends string, T extends Record<keyof T, S>>(
    c: T
): { readonly [K in keyof T]: T[K] } => c;

我假设您希望常量属性被标记为readOnly,并且每个值的类型应该是字符串文本,而不仅仅是string

现在,您可以通过函数而不是注释来定义常量:

export const Elements = asConstants({
    DESCRIPTION: "DescriptionAutoField2",
    FORMULA_CALC: "FormulaCalcAutoField1",
    CHART_CODE: "ChartCodeAutoField1",
    CHART_CODE_DESCRIPTION: "ChartDescriptionAutoField1",
});

export const ChartAttr = asConstants({
    CHART: "Chart",
    CHART_DESCRIPTION: "ChartDescr",
});

export const SliceLink = asConstants({
    SLICE_CODE: "SliceCode",
    SLICE_DESC: "SliceDesc",
    SLICE_CALC: "SliceCalc",
});

如果使用IDE的IntelliSense检查元素图表属性切片链接的类型,您会看到:

/*
const Elements: {
    readonly DESCRIPTION: "DescriptionAutoField2";
    readonly FORMULA_CALC: "FormulaCalcAutoField1";
    readonly CHART_CODE: "ChartCodeAutoField1";
    readonly CHART_CODE_DESCRIPTION: "ChartDescriptionAutoField1";
}

const ChartAttr: {
    readonly CHART: "Chart";
    readonly CHART_DESCRIPTION: "ChartDescr";
}

const SliceLink: {
    readonly SLICE_CODE: "SliceCode";
    readonly SLICE_DESC: "SliceDesc";
    readonly SLICE_CALC: "SliceCalc";
}
*/

如果你试图传递一个错误的值到asConstance()你会得到一个错误:

asConstants({
    NOT_A_STRING: 1, // error! number not a string        
})

好的,希望能有帮助。祝你好运

链接到代码

 类似资料:
  • 如果它走路像鸭子,说话像鸭子,样子像鸭子,叫声也像鸭子,那它就是一只鸭子。 对于 Nutz Ioc 来说,它面对的配置文件就是层层嵌套的 "名值对集合",或者说是 Map 集合。 事实上,它是先把整个配置文件解析成 Map 再做判断的。 如果一个 Map 仅包括如下的键,则被认为是一个注入对象: type 对象类型 singleton 是否单例 scope 生命周期范围 events 监听事件 a

  • 问题内容: 我需要使用可以通过循环轻松获得的命名模式来创建大量对象。有什么办法可以像这样从变量中读取对象名称? 我不需要为对象分配变量名,仅是在分配时从其获取名称。 问题答案: 您所选择的单词表明您不完全了解变量和对象的工作方式,因此您需要对其进行修复以使其在Java中得到广泛应用。 如果我写: 我创建一个新对象, 然后 定义一个指向该对象的变量。 该对象 没有名称 (它具有一个ID,该ID是在运

  • 我正在尝试测试我的控制器方法,它将输入参数作为我应用程序中的一个对象。我知道如何用字符串作为输入参数进行测试,但不知道如何用定制的对象进行测试。 下面是我应用程序中的代码 我认为下面的测试代码是测试的方法之一。但它失败了 当我运行上面的测试时,我得到一个错误,说“实际上,这个模拟没有任何交互”。 你能帮我把定制对象传递给MockMvc post方法吗。

  • 我需要使用一种命名模式创建大量对象,这种命名模式可以通过循环轻松获得。有没有办法像这样从变量中读取对象名? 我不需要为对象分配变量名,只需要在分配时从对象中获取名称即可。

  • 我有一个使用spring-security-jwt和spring-security-oauth2的Spring Boot应用程序。我有一个扩展UserDetails的自定义User对象和一个从loadUserByUsername方法返回此对象的自定义UserDetailsService。 但是,当我使用身份验证对象的getPrincipal方法并试图强制转换到我的自定义用户对象时,它失败了,因为主

  • 我想定义一个带有对象和不同类型的接口,例如 在定义上,没有问题,但在调用like后 这不起作用,并出现以下错误 错误错误:未捕获(promise中):TypeError:无法设置未定义的属性“名称”TypeError:无法设置未定义的属性“名称” 有一些相似的主题,但它们并不完全相关。(如何在类型脚本接口中定义对象或者如何在类型脚本中定义对象变量的类型?) 我很感激你帮助我找到解决办法。