10
votes

I'm using Typescript 2.3.4, Node.JS 8.0.0, and the Feathers framework (version 2.1.1). I am making an express route that uses a service, and when I try to use the service after grabbing the singleton instance on the feathers app, Typescript is throwing an error TS2532: Object is possibly 'undefined' error, even after an explicit type guard.

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');
      }
    }
}

I've also tried writing someService!.create... but that didn't work either.

1
What is the type of someService? What line does the error occur on?dbandstra
Error is on let data = someService.create({test: 'hello'}); line, and someService is defined as a Service<any> type as per the app.service<any>('predefined-service') call (that type comes from feathers). Feathers services work by first registering them.Sean Newell

1 Answers

15
votes

From the Feathers typings:

interface Service<T> extends events.EventEmitter {

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

The create method itself is optional (for whatever reason). If you're sure the method exists you could put the ! operator after, like this:

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