Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Typescript中将接口转换为映射类型 背景_Typescript_Mapped Types - Fatal编程技术网

如何在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)。