У меня есть тип FieldType
, который является перечислением, и FieldTypeToTSType
, который получает FieldType
в качестве параметра и преобразует его в тип машинописного текста.
type FieldType = "string" | "int";
type FieldTypeToTSType<T extends FieldType> =
T extends "string" ? string
: T extends "int" ? number
: never;
, но проблема заключается в использовании он напрямую работает:
FieldTypeToTSType<"string"> // string
FieldTypeToTSType<"int"> // number
, но когда я использую FieldType
, он всегда определяет его как строку
const a: FieldType = "int";
type K = FieldTypeToTSType<typeof a>; // string but it should be number
контекст, в котором я его использую:
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>;
Тип VacationRef должен быть
type VacationRef = {
days: number;
name: string;
}
, но это:
type VacationRef = {
days: string | number;
name: string | number;
}