对返回对象文字的Array.map进行类型检查

时间:2018-12-13 08:27:20

标签: typescript

我已经在TypeScript游乐场中创建了this example

interface Test{
    a: string
    b: string
}

const object: Test = {
    a: 'b',
    b: 'c',
}

function testIt(): Test[] {
    const data = [{b: '2', c: '3'}]
    const prices: Test[] = data.length ? data.map((item) => {
        return {
            a: item.b,
            b: item.c,
            c: '2',
            d: '3'
        }
    }) : [];
    return prices;
}

从数组映射方法的对象返回语句中删除a或b属性会导致TypeScript错误(按预期方式)。

添加c或d或任何其他随机未知属性不会触发TypeScript错误。我怀疑只有在接口包含[x:string]:any的情况下才有可能。

那么,为什么Array.map对接口上缺少的属性进行类型检查,而不对其他/未知属性进行类型检查?

1 个答案:

答案 0 :(得分:1)

问题是,根据基本的OOP规则,派生类型(即具有更多属性的类型)应与基本类型(即仅具有<IfModule mod_rewrite.c> RewriteEngine On RewriteBase / RewriteCond %{REQUEST_URI} !^/css RewriteCond %{REQUEST_URI} !^/js RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*)$ index.php?url=$1 [QSA,L] </IfModule> a的类型)兼容。

话虽如此,当分配具有更多属性的对象文字时,如果期望类型具有较少属性的类型,typescript确实会警告我们。这称为多余属性检查。此功能仅在对指定类型的对象进行直接分配时起作用。

此多余属性检查不适用于您的情况的原因是对b进行类型检查的方式。首先,根据对象文字推断出回调返回类型,因此将其推断为map。然后,此类型用作{ a: string, b: string, c: string, d: string }的返回类型,因此map将返回map。然后,将其分配给Array<{ a: string, b: string, c: string, d: string }>,在第一条规则下它是允许的。我们没有在任何地方将对象常量分配给期望Test[]的地方。

发生错误的一种方法是不让打字稿推断出传递给Test的回调结果。我们可以通过在回调中添加注释来实现。然后,我们直接将对象文字分配给期望map的位置:

Test