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
})
好的,希望能有帮助。祝你好运
使用枚举或常量枚举使用枚举或常量枚举