打字稿array.map丢失返回类型

时间:2018-12-21 07:30:09

标签: arrays typescript dictionary types

我希望在以下代码中出现类型错误,但是对于打字稿来说,完全可以,您能告诉我为什么吗?

export interface Structure {
    aaa: string;
}

export function f1(): Structure[] {  // OK for typescript, not for me
    const result = [].map(certState => {
        return {
            aaa: 'aaa',
            ADDITIONAL_FIELD: 'asdf'
        }
    });

    return result;
}

export function f2(): Structure[] { // ERROR for typescript (and for me)
        return [
            {
                aaa: 'sdf',
                ADDITIONAL_FIELD: 'asdf'
            }
        ]
    }

Here is the link

谢谢!

2 个答案:

答案 0 :(得分:0)

该错误是由于您在f2()中直接返回结果所致。

如果您将f2()更改为

export function f2(): Structure[] {
    const returnVal = [
        {
            aaa: 'sdf',
            ADDITIONAL_FIELD: 'asdf'
        }
    ]

    return returnVal;
}

那么就不会有编译器错误。

TypeScript使用structural typing来确定类型兼容性,因此在f1()的代码中,result的类型为

{
   aaa: string,
   ADDITIONAL_FIELD: string
}[]

Structure[]兼容(类型变窄没有危险)。

我不确定100%为什么直接返回不起作用,但我的假设是在f2()中,您告诉编译器“此特定数组的类型为Structure[]” 它说不,不是。当您在f1()中有一个中间变量时,您说的是“此函数返回Structure[]”,而当您返回中间变量时,编译器会检查并说“好的result匹配Structure[] ”,因此该功能正在执行其所要求的操作。

我很想知道别人是否有更严格的解释

答案 1 :(得分:0)

我刚刚了解到Typescript具有仅用于对象文字的精确类型的概念,因此f1不使用对象文字,因此无法添加其他属性,并且该属性对Typescript有效。 f2使用对象文字,因此不允许使用其他属性。这让我很害怕,但这就是打字稿的工作原理