在类型保护错误 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<any>('predefined-service')
调用定义为Service<any>
类型(该类型来自羽毛)。羽毛服务工作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)