是否可以使用修改后的类型键生成Type ?



是否可以基于修改其键的对象创建Typescript类型?

例如,这是我想要实现的事情:

const super: SuperType<{getData: any}> = ...
super.getDataEXTENSION (Note it should have this modified key)

我知道我们可以定义

type ModifiedName<T extends string> = `${Capitalize<T>}EXTENSION`;
type GetObjectWithModifiedPropertyNames<T extends any> = {
[key in keyof T]: any;
};

但是计算键是有问题的:

type GetObjectWithModifiedPropertyNames<T extends any> = {
[key: ModifiedName<keyof T>]: any;
};

我知道可以修改返回类型,参数等,但关于修改键,我不确定这是可能的。

您可以在映射类型中使用as语法:

type ModifiedName<T extends string> = `${Capitalize<T>}EXTENSION`
type Foo = {foo: string, bar: number}
// type ModifiedFoo = {FooEXTENSION: string, BarEXTENSION: number}
type ModifiedFoo = {[K in keyof Foo as ModifiedName<K>]: Foo[K]}

操场上联系

你可以使用TypeScript的条件类型语法来只允许字符串类型的键。以下代码将ModifiedName定义为大写键+ EXTENSION,仅当key扩展字符串时。否则键将不会在类型中使用,因为条件的假响应是永远不会

type ModifiedName<T extends string | number | Symbol> =
`${ T extends string ? Capitalize<T> : never }EXTENSION`;
type GetObjectWithModifiedPropertyNames<T> = {
[key in ModifiedName<keyof T>]: any;
};

下面的示例显示了一个有效的使用场景。它不会期望1EXTENSION是一个键,并且添加['1EXTENSION']属性会导致错误。

interface Foo {
abc: number;
efg: string;
1: string;
}
let obj: GetObjectWithModifiedPropertyNames<Foo> = {
AbcEXTENSION: 'hi',
EfgEXTENSION: 'avc'
};

相关内容

最新更新