打字稿:如何从对象中获取属性子集?

时间:2018-06-22 06:09:14

标签: javascript typescript

示例:

type t = {
  a1: boolean;
  a2: number;
  a3: string;
};

const o1 = {
  a1: true,
  a2: 1,
  a3: 'blah',
  a4: false,
  a5: 'blah blah'
}

const o2: t = o1 as t;  // this doesn't work as I expected

如何动态设置o2以仅接受适合类型t的o1属性?

即,保留适合的属性并丢弃其余属性。在这种情况下,结果等于

const o2: t = {
  a1: o1.a1,
  a2: o1.a2,
  a3: o1.a3
}

除了随着t的变化可能动态进行之外。

3 个答案:

答案 0 :(得分:1)

我认为TypeScript没有内置任何可让您执行此操作的功能。这将需要某种形式的反射,而这又将需要TypeScript向其输出的JavaScript发出t成员列表,而通常不会。我没有在TypeScript文档中找到任何有关反射的信息(这很令人惊讶)。

作为一种解决方法,您可以列出数组中的成员。这是重复的,但似乎是不可避免的重复:

type t = {
  a1: boolean;
  a2: number;
  a3: string;
};
const t_members = ["a1", "a2", "a3"];

然后是一个简单的循环:

const o2: t = {} as t;
for (const member of t_members) {
    o2[member] = o1[member];
}

如果您经常这样做,请为其创建实用程序功能。

答案 1 :(得分:1)

据我所知,Const o2正在成为类型对象,而不是类型t,因此它会占用您要分配的所有属性,

在这里您可以做一件事, `

class t  {
  a1: boolean;
  a2: number;
    a3: string;
    constructor(a:any) {
        this.a1 = a.a1;
        this.a2 = a.a2;
        this.a3 = a.a3;
  }
};

type c={
     a1: boolean,
  a2: number,
  a3: string,
  a4: false,
  a5: string

}

const o1:c = {
  a1: true,
  a2: 1,
  a3: 'blah',
  a4: false,
  a5: 'blah blah'
}

let o2: t = new t(o1);

`

这可能有帮助。

答案 2 :(得分:0)

进行自定义功能并检查:

var t = {
  a1: 'boolean',
  a2: 'number',
  a3: 'string'
};

const o1 = {
  a1: true,
  a2: 1,
  a3: 'blah',
  a4: false,
  a5: 'blah blah'
}

function clone(obj,type) {
    if (null == obj || "object" != typeof obj) return obj;
    var copy = obj.constructor();
    for (var key in obj) {
    var val=obj[key];
    var exists=checkExists(type,key,val);
    if(exists)
    {
     if (obj.hasOwnProperty(key)) copy[key] = obj[key];
    }
       
    }
    return copy;
}

function checkExists(obj,oldkey,oldval){
var resp;
oldval=typeof(oldval);
for (var key in obj) {
    var val=obj[key];
        if(oldval==val) // use (oldkey==key && oldval==val) to check all key and val
        {
         resp = true;
         break;
        }else{
         resp = false;
        }
    }
    
    return resp;
}

var out=clone(o1,t);
console.log(out);