在类型保护错误 TS2532 之后,Typescript 对象可能未定义

Posted

技术标签:

【中文标题】在类型保护错误 TS2532 之后,Typescript 对象可能未定义【英文标题】:Typescript Object is possibly undefined after type guard error TS2532 【发布时间】:2017-11-11 22:13:47 【问题描述】:

我正在使用 Typescript 2.3.4、Node.JS 8.0.0 和 Feathers 框架(版本 2.1.1)。我正在制作使用服务的快速路由,当我在羽毛应用程序上抓取单例实例后尝试使用服务时,Typescript 抛出 error TS2532: Object is possible 'undefined' 错误,即使在显式类型保护之后。

routes.ts

import feathers = require('feathers');

export default function(this: feathers.Application) 
  const app = this;

  app.post(
    '/donuts',
    async (req, res) => 
      const someService = app.service<any>('predefined-service');

      if(typeof someService === "undefined" || !authService) 
        res.redirect('/fail');
        return;
      

      try 
        let data = someService.create(test: 'hello');
        console.log(data);
        res.redirect('/success');
       catch(err) 
        res.redirect('/fail');
      
    

我也试过写someService!.create...,但也没有用。

【问题讨论】:

someService 的类型是什么?错误发生在哪一行? 错误出现在let data = someService.create(test: 'hello'); 行,someService 根据app.service&lt;any&gt;('predefined-service') 调用定义为Service&lt;any&gt; 类型(该类型来自羽毛)。羽毛服务工作by first registering them. 【参考方案1】:

来自Feathers typings:

interface Service<T> extends events.EventEmitter 

  create?(data: T | T[], params?: Params, callback?: any): Promise<T | T[]>;

create 方法本身是可选的(无论出于何种原因)。如果您确定该方法存在,您可以将 ! 运算符放在后面,如下所示:

let data = someService.create!(test: 'hello');

【讨论】:

这是有道理的,有些服务不会暴露create 或其他 REST 端点,因为用户定义的服务基本上可以做任何他们想做的事情。 有人能解释一下'!'的工作吗?在这种情况下?是不是只是说“我知道它会被‘定义’,所以不要担心向我显示任何警告......我不担心” 是的,没错。它是在 TS 2.0 中添加的。他们称其为“类型断言运算符”或“非空断言运算符”(尽管它也适用于未定义)。它没有运行时影响。

以上是关于在类型保护错误 TS2532 之后,Typescript 对象可能未定义的主要内容,如果未能解决你的问题,请参考以下文章

无法解决 ts 错误:对象可能是“未定义”.ts(2532)

对象可能是带有可选参数的 'undefined'.ts(2532)

安装typescript的命令,编译typescr为JavaScript

如何在vue中使用ts

绑定元素“组件”隐式具有“任何”类型.ts [重复]

Typescript爬虫实战(2) ---- 使用表单的形式对接口进行保护