示例:
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的变化可能动态进行之外。
答案 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);