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

Javascript 类型保护错误TS2532后,Typescript对象可能未定义,javascript,node.js,typescript,feathersjs,Javascript,Node.js,Typescript,Feathersjs,我使用的是Typescript2.3.4、Node.JS8.0.0,以及Feathers框架(版本2.1.1)。我正在创建一个使用服务的快速路由,当我在feathers应用程序上抓取singleton实例后尝试使用该服务时,Typescript抛出了一个错误TS2532:对象可能是“未定义”错误,即使在显式类型保护之后也是如此 路由。ts import feathers=require('feathers'); 导出默认函数(此:feathers.Application){ const-app

我使用的是Typescript
2.3.4
、Node.JS
8.0.0
,以及Feathers框架(版本
2.1.1
)。我正在创建一个使用服务的快速路由,当我在feathers应用程序上抓取singleton实例后尝试使用该服务时,Typescript抛出了一个错误TS2532:对象可能是“未定义”错误,即使在显式类型保护之后也是如此

路由。ts

import feathers=require('feathers');
导出默认函数(此:feathers.Application){
const-app=这个;
app.post(
“/甜甜圈”,
异步(请求、恢复)=>{
const someService=app.service(“预定义服务”);
if(someService的类型==“未定义”| |!authService){
res.redirect('/fail');
返回;
}
试一试{
让data=someService.create({test:'hello'});
控制台日志(数据);
res.redirect('/success');
}捕捉(错误){
res.redirect('/fail');
}
}
}
我也尝试过编写
someService!.create…
,但也没有成功。

来自:


someService的类型是什么?错误发生在哪一行?错误发生在
let data=someService.create({test:'hello'})上
line,而
someService
被定义为
服务。这是有道理的,一些服务不会公开
create
或其他REST端点,因为用户定义的服务基本上可以做任何他们想做的事情。有人能解释一下在这种情况下“!”的工作吗?这只是说“我知道它将被‘定义’,所以不要担心给我显示任何警告……我不担心”是的,没错。它是在TS 2.0中添加的。他们称它为“类型断言运算符”或“非空断言运算符”(尽管它也适用于未定义)。它没有运行时效果。
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');
      }
    }
}
interface Service<T> extends events.EventEmitter {

  create?(data: T | T[], params?: Params, callback?: any): Promise<T | T[]>;
let data = someService.create!({test: 'hello'});