Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/405.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 基于枚举类型值设置属性的类型_Javascript_Typescript - Fatal编程技术网

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;