有没有办法保证接口的所有属性都得到解决

时间:2017-03-31 12:27:31

标签: typescript

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

2 个答案:

答案 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的了解,我说它不可能。但你正在做的事情似乎只是想做

&#13;
&#13;
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;
&#13;
&#13;

由于您的界面未将这些属性标记为可选(one?: number,请注意问号),如果缺少任何内容,则无法调用该函数(显然,如果没有强制转换为{{ 1}}或类似的东西)。