繁体   English   中英

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

[英]typescript array.map lost returned type

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

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'
            }
        ]
    }

链接在这里

谢谢!

该错误是由于您在f2()中直接返回结果这一事实造成的。

如果将f2()更改为

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

    return returnVal;
}

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

TypeScript使用结构化类型确定类型兼容性,因此在f1()代码中, result为类型

{
   aaa: string,
   ADDITIONAL_FIELD: string
}[]

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

我不确定100%为什么直接返回不起作用,但是我的假设是在f2()您告诉编译器“此特定数组的类型为Structure[] ”,并且说不,不是。 当您在f1()有一个中间变量时,您将说“此函数返回Structure[] ”,而当您返回中间变量时,编译器将检查并说“好的resultStructure[]匹配”,因此此函数将按照其说明进行操作。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM