Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.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,住手!重要!先读: 我不想解决下面的序列化问题,我只是将其作为一个示例使用 真正的问题在最后,谢谢你 更新: 我知道有一个选项可以使用Object.keys()遍历所有属性,但是这不是我想要的,我正在寻找一种方法来亲自处理每个属性 更新: 问题解决了,请查看下面我的答案 原始问题: 假设我有一个接口 interface Data { one: number; another: string; } 我有一个序列化方法 serialize(data: Data): string { ret

住手!重要!先读:

我不想解决下面的序列化问题,我只是将其作为一个示例使用

真正的问题在最后,谢谢你

更新:

我知道有一个选项可以使用
Object.keys()
遍历所有属性,但是这不是我想要的,我正在寻找一种方法来亲自处理每个属性

更新:

问题解决了,请查看下面我的答案

原始问题:

假设我有一个接口

interface Data { one: number; another: string; }
我有一个序列化方法

serialize(data: Data): string {
    return 'one: ' + data.one + ', another: ' + data.another;
}
现在我正在进行重构,希望向
数据
接口添加一个新属性,以便

interface Data { one: number; another: string; yetAnother: boolean; }
现在,根据要求,新属性
yetAnother
也必须序列化,但编译器不会指出这一点,因为我没有要求它,所以有可能会出现错误

现在我的问题是:如果我处理了接口的所有属性,是否有办法询问TypeScript编译器


交叉发布到TypeScript:

根据我对TypeScript的了解,我认为这是不可能的。但是你所做的看起来就像你想做的一样

接口数据{one:number;one:string;yetAnother:boolean;}
函数序列化(数据:数据):字符串{
让结果=“”;
Object.keys(数据).forEach(k=>{
if(data.hasOwnProperty(k)){
结果+=`${k}:${data[k]}`;
}
});
返回结果;

}
找到了一个优雅的解决方案,谢谢大家(请在以下网址试用):

type Around={[P in keyof T]:(结果:R,值:T[P],名称:P)=>R;}
函数环绕(数据:T,结果:R,环绕:环绕):R{
for(数据中的常量名称){
结果=大约[名称](结果、数据[名称]、名称);
}
返回结果/
}
函数标识(值:T):T{返回值;}
函数addOver(toString:(值:T)=>string){
返回函数add(值:string[],值:T,名称:string):string[]{
push(名称+':'+toString(值));
返回值;
};
}
接口数据{one:number,one:string,yetAnother:boolean}
函数序列化(数据:数据):字符串{
返回(数据,[]{
一:附加(字符串),
另一个:addOver(identity),
yetAnother:addOver(字符串)
})。加入(‘,’);
}
const serialized=serialize({one:1,other'hey',yetAnother:true});
警报(序列化)//one:1,one:hey,yetAnother:true

我认为这是不可能的,但是为什么不直接遍历
数据的键
并使你的
序列化
方法通用化,这样你就不会面临这些问题呢?不,没有办法,我认为在任何其他语言中也不可能做到这一点。在大多数语言中,您都有某种内置的序列化功能,在typescript/javascript中,您可以使用它,它将始终序列化您传递给它的对象中的所有属性。如果您选择自己序列化,那么您也需要自己维护它。不过,我会使用
map
join
来处理逗号:
return Object.keys(data.map)(x=>`${x}:${data[x]}`)。join(“,”
type Around<T, R> = { [P in keyof T]: (result: R, value: T[P], name: P) => R; }
function around<T, R>(data: T, result: R, around: Around<T, R>): R {
    for (const name in data) {
        result = around[name](result, data[name], name);
    }
    return result;/
}

function identity<T>(value: T): T { return value; }
function addOver<T>(toString: (value: T) => string) {
    return function add(values: string[], value: T, name: string): string[] {
         values.push(name + ': ' + toString(value));
         return values;
    };
}

interface Data { one: number, another: string, yetAnother: boolean }

function serialize(data: Data): string {
   return around<Data, string[]>(data, [], {
       one: addOver(String),
       another: addOver(identity),
       yetAnother: addOver(String)
   }).join(', ');
}

const serialized = serialize({ one: 1, another: 'hey', yetAnother: true });
alert(serialized) // one: 1, another: hey, yetAnother: true