繁体   English   中英

通用、联合和扩展。 Typescript

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM