Freshness

    结构类型非常方便。考虑如下例子代码,它可以让你非常便利的从 JavaScript 迁移至 TypeScript,并且会提供类型安全:

    但是,结构类型有一个缺点,它能误导你认为某些东西接收的数据比它实际的多。如下例,TypeScript 发出错误警告:

    1. console.log(something.name);
    2. }
    3. logName({ name: 'matt' }); // ok

    WARNING

    如果没有这种错误提示,我们可能会去寻找函数的调用 logName({ name: 'matt', job: 'being awesome' }),继而会认为 logName 可能会使用 job 属性做一些事情,然而实际上 并没有使用它。

    另外一个使用比较多的场景是与具有可选成员的接口一起使用,如果没有这样的对象字面量检查,当你输入错误单词的时候,并不会发出错误警告:

    之所以只对对象字面量进行类型检查,因为在这种情况下,那些实际上并没有被使用到的属性有可能会拼写错误或者会被误用。

    1. let x: { foo: number, [x: string]: any };
    2. x = { foo: 1, baz: 2 }; // ok, 'baz' 属性匹配于索引签名

    用例:React State

    Facebook ReactJS 为对象的 Freshness 提供了一个很好的用例,通常在组件中,你只使用少量属性,而不是传入所有,来调用 setState

    如果你想使用 Freshness,你可能需要将所有成员标记为可选,这仍然会捕捉到拼写错误:

    1. // 假设
    2. interface State {
    3. foo?: string;
    4. bar?: string;
    5. // 你可能想做
    6. this.setState({ foo: 'Hello' }); // Yay works fine!
    7. // 由于 Freshness,你也可以防止错别字
    8. this.setState({ foos: 'Hello' }}; // Error: 对象只能指定已知属性