javascript - 根据枚举类型值设置属性的类型
问题描述
我有一个类型FieldType
,它是一个枚举,FieldTypeToTSType
它以 aFieldType
作为参数并将其转换为 typescript 类型。
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"]>;
};
In makeEntity
- 传递的参数应该具有泛型类型,因此可以正确推断其类型而不是扩大:
const makeEntity = <T extends { [K in keyof T]: FieldDefinition }>(et: T) => et;
推荐阅读
- sql - 为什么在子表而不是父表上声明 ON DELETE CASCADE?
- ios - runtime/cgo: 无法获得 pthread_keys 模拟器错误
- python - 使用 python 中的 openpyxl 模块旋转工作簿中的图像
- ansible - 如果我删除 /etc/ansible 目录,ansible 会崩溃吗?
- android - java.lang.IllegalArgumentException:所有请求的项目必须由特定 ID 引用(Android)
- time - 具有多个图形的 3d GNUPLOT 动画
- reactjs - 当我使用我在 git 中分叉的 NPM 安装一个模块时,我只得到一些文件,这是为什么呢?
- java - 如何从 Android 中生成的密钥对中获取 X509Certificate?
- python-3.x - Python 代码第一次工作,然后它不显示任何输出,然后它再次工作。盈透证券 API
- oracle - 通过 Oracle APEX 调用和传递 cURL 命令?