【问题标题】:this `implicitly` has type any it does not have type annotation?这个 `implicitly` 有任何类型它没有类型注释?
【发布时间】:2019-03-20 00:38:27
【问题描述】:

我正在调用函数this.buildSingleRequestBody 它正在抛出错误这个隐含的类型有任何它没有类型注释,不确定是什么实现了错误。

main.ts

 private  buildRequestArray(specialtyMembers: ISpecialtyInfoObj[],
                               request: ICombinedAccountBalanceRequest): IRequestURL[] {
        const specialtyUrl = urlConfig.specialtyBaseUrl + "payments/getAccountBalance";

        const serviceContext = request.header.serviceContext;
        const requestArray: IRequestURL[] = specialtyMembers.map(function(member) {
            const body: any = this.buildSingleRequestBody(member, serviceContext);
            return {url: specialtyUrl, body};
        });

        return requestArray;
    }


   private buildSingleRequestBody(specialtyMember: ISpecialtyInfoObj, serviceContext: IServiceContext) {
        return {
            "header": {
                serviceContext
            },
            "specialtyId": specialtyMember.Id || "78988716",
            "specialtySource": specialtyMember.specialtySource || "HBS"
        };
    }

【问题讨论】:

    标签: javascript typescript this


    【解决方案1】:

    function 不会从声明上下文中捕获this,而是this 由调用者决定。由于您在调用map 时使用function,因此匿名函数内部的this 将不会引用该类。由于map 没有明确声明它将传递给函数的this 的类型,所以this 的类型在匿名函数内部将隐含为any,因此会出现错误。

    改用箭头函数,因为这将捕获声明 this

    private  buildRequestArray(specialtyMembers: ISpecialtyInfoObj[],
                               request: ICombinedAccountBalanceRequest): IRequestURL[] {
        const specialtyUrl = urlConfig.specialtyBaseUrl + "payments/getAccountBalance";
    
        const serviceContext = request.header.serviceContext;
        const requestArray: IRequestURL[] = specialtyMembers.map((member) => {
            const body: any = this.buildSingleRequestBody(member, serviceContext);
            return {url: specialtyUrl, body};
        });
    
        return requestArray;
    }
    
    
    private buildSingleRequestBody(specialtyMember: ISpecialtyInfoObj, serviceContext: IServiceContext) {
        return {
            "header": {
                serviceContext
            },
            "specialtyId": specialtyMember.Id || "78988716",
            "specialtySource": specialtyMember.specialtySource || "HBS"
        };
    }
    

    【讨论】:

    • 如果我想要的功能是为了不被捕获但我希望它与 javascript 中的类不同,你可以轻松地做到这一点,如果 Typescript 只是一组 Javascript 不应该我也可以在 TypeScript 中做到这一点?
    • @BoxandCox 取决于您要执行的操作,使用常规的 function or 方法将导致这不会被捕获。您还可以为函数注释 this 的类型(例如:function (this: SomeType)),尽管这并不总是需要。我需要一个你正在做什么的例子来提供更多建议
    猜你喜欢
    • 2017-06-16
    • 2021-09-27
    • 1970-01-01
    • 1970-01-01
    • 2018-10-29
    • 1970-01-01
    • 2016-10-26
    • 2017-11-03
    • 2019-04-13
    相关资源
    最近更新 更多