我有一个FieldType
枚举类型,FieldTypeToTSType
它获取 aFieldType
作为参数并将其转换为打字稿类型。
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;
}
它不起作用,因为FieldType
源实体在makeEntity
和 中加宽EntityRefrence
。要解决此问题EntityRefrence
- 使用特定键而不是所有可能键的联合:
type EntityRefrence<T extends EntityDefinition<T>> = {
[key in keyof T]: FieldTypeToTSType<T[key]["type"]>;
};
在makeEntity
-传递的参数应该有泛型类型,所以它的类型推断的正确,而不是扩大:
const makeEntity = <T extends { [K in keyof T]: FieldDefinition }>(et: T) => et;
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句