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 - Fatal编程技术网

Typescript-如何将对象强制转换到接口

Typescript-如何将对象强制转换到接口,typescript,Typescript,假设有一个接口 interface A { a: number; } 现在我有一个原始对象 const a = { a: 1, b: '2' }; 我希望得到x的方法是{a:1},它只包含在接口中定义的成员 这可以通过创建一个空的{}并循环和填充所有A的成员来实现,但是考虑到接口成员和对象的冗余字段可能多达几十个,这样做是不实际的 我试过了 let x = <A> a; // or let x = a as A; console.log((x as any).b); // s

假设有一个接口

interface A {
  a: number;
}
现在我有一个原始对象

const a = { a: 1, b: '2' };
我希望得到
x
的方法是
{a:1}
,它只包含在接口中定义的成员

这可以通过创建一个空的
{}
并循环和填充所有
A
的成员来实现,但是考虑到接口成员和对象的冗余字段可能多达几十个,这样做是不实际的

我试过了

let x = <A> a; // or let x = a as A;
console.log((x as any).b); // still exist
设x=a;//或者让x=a作为a;
console.log((如有).b);//仍然存在

我还查找了
lodash
,找到了
keys
pick
,但是这些都是针对类实例而不是接口的。

基本上,您的问题归结为将接口的所有属性作为字符串数组获取,然后制作仅包含这些属性的对象副本的问题。制作对象的副本非常简单,并且有大量的示例。但第一个问题更难解决


据我所知,“现在”完成这项工作的唯一方法是在编译过程中为typescript使用自定义转换器。下面是一个示例,但请注意-这需要使用尚未稳定发布的typescript 2.4+。

运行时不存在接口。最好的选择是自己删除不需要的属性,或者创建具有所需属性的对象副本

例如,您可以使用如下方法(复制自的方法):

函数拾取(对象:T,…键:K[]):拾取{
const copy={}作为Pick;
forEach(key=>copy[key]=obj[key]);
返回副本;
}
常数a={a:1,b:'2'};
让我们复制:A=选择(A,“A”);
控制台日志(副本);

这不是TS中甚至不存在的“铸造”。这是“挑选”。@Mike不清楚你想要实现什么。ts duck typing将
a
的类型向下转换为
a
,使用typescript编辑器,您只能访问
a
的成员,但实际对象始终是
a
类型。因为ts类型擦除意味着对象在运行时属于
Object
类型,所以您可以看到整个
a
。如果需要另一个对象,则必须复制其属性(如“拾取解决方案”所建议的)。如果需要编译时检查,请使用
a
,不要担心真实对象是什么。@Aris2World我有一个接口定义,希望将带有冗余字段的对象转换为它。此外,我不想显式地说明要选择的字段。@Mike可能对对象和类型(接口所表示的内容)有误解。假设您还有这个
接口B{B:string;}
。您可以将对象
a
视为
a
B
类型的对象:
let x:a=a
您可以访问
a
的成员或
let x:B=a
您可以访问
B
的成员。对象
a
属于object类型,它是javascript.Good中唯一存在的对象。如果他想要一个
a
类型的变量,他可以写
让x:a=pick(a,“a”)
我如何提供
“a”
?我可以从接口的定义中得到它吗?@Mike否。它必须来自编译后出现的值。如果你想得到一个界面的键,你可以看看Amid的建议。但是看看这个库的源代码(它读取程序的语法树),可能有点太多了。
function pick<T, K extends keyof T>(obj: T, ...keys: K[]): Pick<T, K> {
    const copy = {} as Pick<T, K>;

    keys.forEach(key => copy[key] = obj[key]);

    return copy;
}

const a = { a: 1, b: '2' };
let copy : A = pick(a, "a");
console.log(copy);