如何在Typescript中将接口转换为映射类型 背景
在映射类型的中,给出了以下示例:如何在Typescript中将接口转换为映射类型 背景,typescript,mapped-types,Typescript,Mapped Types,在映射类型的中,给出了以下示例: type Proxy<T> = { get(): T; set(value: T): void; } type Proxify<T> = { [P in keyof T]: Proxy<T[P]>; } function proxify<T>(o: T): Proxify<T> { // ... wrap proxies ... } let proxyProps =
type Proxy<T> = {
get(): T;
set(value: T): void;
}
type Proxify<T> = {
[P in keyof T]: Proxy<T[P]>;
}
function proxify<T>(o: T): Proxify<T> {
// ... wrap proxies ...
}
let proxyProps = proxify(props);
类型代理={
get():T;
set(值:T):无效;
}
类型代理={
[P in keyof T]:代理;
}
函数代理(o:T):代理{
//…包装代理。。。
}
让proxyProps=代理(props);
我不清楚如何编写代理函数
我需要它做什么
我有以下几种
interface User extends BaseRecord {
readonly 'id': number;
readonly 'name'?: string;
}
interface FormField<T> {
readonly value: T;
readonly edited: boolean;
}
type WrappedInFormField<T> = {
[P in keyof T]: FormField<T[P]>;
};
用户界面扩展BaseRecord{
只读“id”:编号;
只读“名称”:字符串;
}
接口FormField{
只读值:T;
只读编辑:布尔;
}
类型WrappedInFormField={
[P in keyof T]:FormField;
};
我需要写一个带有以下签名的函数
const wrap = <T>(o: T): WrappedInFormField<T> => {
// ...What goes here?...
}
wrappedUser: WrappedInFormField<User> = wrap<User>(UserIJustGotFromApi);
const wrap=(o:T):WrappedInFormField=>{
//…这是什么?。。。
}
wrappedUser:WrappedInFormField=wrap(UserIJustGotFromApi);
我该怎么做呢?您只需构建对象即可。Typescript在创建映射类型方面没有任何帮助,您只需像通常在Javascript中一样构建它们
const wrap = <T>(o: T): WrappedInFormField<T> => {
// Create an empty object that we will add the properties to, assert it will be a WrappedInFormField<T> once we are done with it
let result = {} as WrappedInFormField<T>;
// Get all the keys of the original object
for(var key in Object.keys(o)) {
// Create something compatible with FormField
// You could instantiate a class, but you will not have access to the type of each property,
// you could use any instead (for example if FormField<T> is a class you could just call new FormField<any> since types are erased it will not really matter)
result[key] = {
value: o[key],
edited: false
};
}
// return the result
return result;
}
const wrap=(o:T):WrappedInFormField=>{
//创建一个空对象,我们将向其添加属性,并断言一旦我们使用完它,它将是一个WrappedInFormField
让result={}作为WrappedInFormField;
//获取原始对象的所有关键点
对于(对象中的var key.keys(o)){
//创建与FormField兼容的内容
//您可以实例化一个类,但您无权访问每个属性的类型,
//您可以使用any来代替(例如,如果FormField是一个类,您可以调用newformfield,因为类型被擦除了,所以这并不重要)
结果[键]={
值:o[键],
编辑:false
};
}
//返回结果
返回结果;
}
这是一个很好的答案,它消除了我在文档中的误解-谢谢。我做了一些更改,使其与react create app Tslint配置兼容(const代替var,entries代替key)。