Javascript 基于枚举类型值设置属性的类型
我有一个类型Javascript 基于枚举类型值设置属性的类型,javascript,typescript,Javascript,Typescript,我有一个类型FieldType,它是一个枚举和fieldtypetostype,它获取一个FieldType作为参数,并将其转换为typescript类型 type FieldType = "string" | "int"; type FieldTypeToTSType<T extends FieldType> = T extends "string" ? string : T extends "int" ? number : never; 我正在使用它的上
FieldType
,它是一个枚举和fieldtypetostype
,它获取一个FieldType
作为参数,并将其转换为typescript类型
type FieldType = "string" | "int";
type FieldTypeToTSType<T extends FieldType> =
T extends "string" ? string
: T extends "int" ? number
: never;
我正在使用它的上下文:
type FieldType = "string" | "int";
type FieldDefinition = {
type: FieldType;
};
type EntityDefinition<T> = {
[K in keyof T]: FieldDefinition;
};
const makeEntity = <T>(et: { [K in keyof T]: FieldDefinition }) => et;
type FieldTypeToTSType<T extends FieldType> = T extends "string"
? string
: T extends "int"
? number
: never;
type EntityRefrence<T extends EntityDefinition<T>, R extends keyof T = keyof T> = {
[key in R]: FieldTypeToTSType<T[R]["type"]>;
};
const Vacation = makeEntity({
days: {
type: "int",
},
name: {
type: "string"
}
});
type VacationRef = EntityRefrence<typeof Vacation>;
但事实是:
type VacationRef = {
days: string | number;
name: string | number;
}
它不起作用,因为源实体的
FieldType
在makeEntity
和entityreference
中被加宽。要在entityreference
中修复此问题,请使用特定键,而不是所有可能键的并集:
type EntityRefrence<T extends EntityDefinition<T>> = {
[key in keyof T]: FieldTypeToTSType<T[key]["type"]>;
};
它不起作用,因为源实体的
字段类型在makeEntity
和EntityReference
中被加宽。要在entityreference
中修复此问题,请使用特定键,而不是所有可能键的并集:
type EntityRefrence<T extends EntityDefinition<T>> = {
[key in keyof T]: FieldTypeToTSType<T[key]["type"]>;
};
type VacationRef = {
days: string | number;
name: string | number;
}
type EntityRefrence<T extends EntityDefinition<T>> = {
[key in keyof T]: FieldTypeToTSType<T[key]["type"]>;
};
const makeEntity = <T extends { [K in keyof T]: FieldDefinition }>(et: T) => et;