根据枚举类型值设置属性的类型

萨汉德夫斯

我有一个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;
}
阿列克谢·L。

它不起作用,因为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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章