[英]Generic, Union and extending. Typescript
我有一个 class RawTemplate
export type TestUnion = 'test1' | 'test2';
export class RawTemplate {
someProperty: Record<TestUnion, Record<string, string>>;
}
我创建了扩展RawTemplate
的新 class Raw
export class Raw extends RawTemplate {
someProperty: {
test1: { name1: 'name'; name2: 'name' };
test2: { name3: 'name' };
};
}
然后我创建通用类型Generic
和类型Target
export type Key<T extends RawTemplate> = keyof T['someProperty'][TestUnion];
export type Generic<T extends RawTemplate> = Record<Key<T>, string>;
export type Target = Generic<Raw>;
我想得到这样的Target
类型: { name1: string; name2: string; name3: string }
{ name1: string; name2: string; name3: string }
{ name1: string; name2: string; name3: string }
但我得到以下类型: {}
如果我这样重写我的类型:
export type Key<T extends RawTemplate> = keyof T['someProperty']['test1'];
export type Generic<T extends RawTemplate> = Record<Key<T>, string>;
export type Target = Generic<Raw>;
我得到以下Target
类型: { name1: string; name2: string }
{ name1: string; name2: string }
几乎如我所愿。
或者我可以像这样重写我的类型:
export type Key<T extends RawTemplate> = keyof T['someProperty']['test1' | 'test2'];
export type Generic<T extends RawTemplate> = Record<Key<T>, string>;
export type Target = Generic<Raw>;
但我再次得到以下Target
类型: {}
我发现的唯一工作案例:
export type Key1<T extends RawTemplate> = keyof T['someProperty']['test1'];
export type Key2<T extends RawTemplate> = keyof T['someProperty']['test2'];
export type Generic<T extends RawTemplate> = Record<Key1<T>, string> | Record<Key2<T>, string>;
export type Target = Generic<Raw>;
我怎样才能更正写类型? 我将扩展TestUnion
类型,并且我不想每次都重写我的Generic
类型。
您无法使用元组 ( |
) 获取 object 的属性类型。
// type Target = never
type Target = keyof Raw['someProperty']['test1' | 'test2']
您将不得不对键进行元组化。
export type Generic<T extends RawTemplate> = Record<Key<T, 'test1'> | Key<T, 'test2'>, string>;
// type Target = {
// name1: string;
// name2: string;
// name3: string;
// }
export type Target = Generic<Raw>;
或者,加入对象并在其上使用keyof
。
// type Target = {
// name1: string;
// name2: string;
// name3: string;
// }
export type Target = { [key in keyof (Raw['someProperty']['test1'] & Raw['someProperty']['test2'])]: string };
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.