STOP!重要!先阅读:
我不打算解决下面的序列化问题,我只用它作为例子
真实的问题已经结束了,谢谢
更新:
我知道使用Object.keys()
迭代所有属性的选项,但这不是我想要的,我正在寻找一种方法来亲自处理每个属性
更新:
问题解决了,请查看下面的答案
原始问题:
说我有一个界面
interface Data { one: number; another: string; }
我有序列化方法
serialize(data: Data): string {
return 'one: ' + data.one + ', another: ' + data.another;
}
现在我正在进行重构,并希望在Data
界面添加新属性,以便
interface Data { one: number; another: string; yetAnother: boolean; }
现在通过要求新属性yetAnother
也必须序列化,但编译器不会指出,因为我没有要求它,所以有可能出现错误< / p>
现在我的问题:如果我解决了接口的所有属性,有没有办法询问TypeScript编译器?
交叉使用TypeScript:https://github.com/Microsoft/TypeScript/issues/14947
答案 0 :(得分:0)
找到了一个优雅的解决方案,感谢所有人(在playground尝试一下):
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
答案 1 :(得分:-1)
凭借我对TypeScript的了解,我说它不可能。但你正在做的事情似乎只是想做
interface Data { one: number; another: string; yetAnother: boolean; }
function serialize(data: Data): string {
let result = '';
Object.keys(data).forEach(k => {
if (data.hasOwnProperty(k)) {
result += `${k}: ${data[k]}`;
}
});
return result;
}
&#13;
由于您的界面未将这些属性标记为可选(one?: number
,请注意问号),如果缺少任何内容,则无法调用该函数(显然,如果没有强制转换为{{ 1}}或类似的东西)。