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

Typescript 如何使用constans定义对象的通用接口?,typescript,typedef,type-definition,Typescript,Typedef,Type Definition,在这个项目中,我有几个带有字符串常量的对象。例如: export const Elements: Constants { DESCRIPTION: "DescriptionAutoField2", FORMULA_CALC: "FormulaCalcAutoField1", CHART_CODE: "ChartCodeAutoField1", CHART_CODE_DESCRIPTION: "ChartDescriptionAutoField1", }; exp

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

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

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

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

// helper function
const asConstants = <S extends string, T extends Record<keyof T, S>>(
    c: T
): { readonly [K in keyof T]: T[K] } => c;
如果使用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";
}
*/
如果试图将错误值传递给
asConstants()
,则会出现错误:

asConstants({
    NOT_A_STRING: 1, // error! number not a string        
})
好的,希望能有帮助。祝你好运


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

// helper function
const asConstants = <S extends string, T extends Record<keyof T, S>>(
    c: T
): { readonly [K in keyof T]: T[K] } => c;
如果使用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";
}
*/
如果试图将错误值传递给
asConstants()
,则会出现错误:

asConstants({
    NOT_A_STRING: 1, // error! number not a string        
})
好的,希望能有帮助。祝你好运


使用枚举或常量枚举使用枚举或常量枚举