【问题标题】:Typescript Object is possibly undefined after type guard error TS2532在类型保护错误 TS2532 之后,Typescript 对象可能未定义
【发布时间】: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.

标签: javascript node.js typescript feathersjs


【解决方案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 中添加的。他们称其为“类型断言运算符”或“非空断言运算符”(尽管它也适用于未定义)。它没有运行时影响。
猜你喜欢
  • 2021-12-29
  • 2022-01-05
  • 1970-01-01
  • 2021-10-08
  • 2021-10-07
  • 2020-12-01
  • 2018-09-11
  • 2022-01-20
相关资源
最近更新 更多