Javascript 找不到TypeScript属性错误:

Javascript 找不到TypeScript属性错误:,javascript,angular,typescript,Javascript,Angular,Typescript,我的vscode中出现以下错误: [ts] Property 'getPatientAllAddress' does not exist on type 'Object'. 为什么要检查动态添加的getPatientalAddress()方法? 这通常不会发生在Javascript中 get addresses() { if (this.data && this.data.hasOwnProperty("getPatientAllAddress")) {

我的vscode中出现以下错误:

[ts] Property 'getPatientAllAddress' does not exist on type 'Object'.
为什么要检查动态添加的getPatientalAddress()方法? 这通常不会发生在
Javascript

get addresses() {
    if (this.data && this.data.hasOwnProperty("getPatientAllAddress")) {
        return this.data.getPatientAllAddress();
    }
}

如何抑制/忽略此警告

到目前为止,
this.data
具有类型
Object
。发生此错误的原因是您试图访问类型为
对象的变量的
.getPatientalAddress()
属性。即使您已经从逻辑上确认了它应该具有该属性,但编译器还不足以理解它应该使该属性在该变量的接口上可用

解决方案1

如果没有启用
noImplicitAny
标志,则可以将最后一行更改为

return data['getPatientAllAddress']();
解决方案2

this.data
的类型设置为
:{getPatientalAddress?:Function}
(或者在更好的情况下创建与包含该函数的this.data对应的接口)

使用函数或适当的更具体的类型

解决方案3

为完整数据定义一个接口

interface Bleh {
    getPatientAllAddress : Function
}
和一个类型的守卫

function isBleh(x:any) : x is Bleh {
    return x && x.hasOwnProperty("getPatientAllAddress");
}
并用作

if (isBleh(this.data)) {
    this.data.getPatientAllAddress();
}


解决方案1是最简单的,解决方案2是最正确的(尽管您也应该在该接口中定义所有其他内容,而不仅仅是这个可选函数),解决方案3一半是展示语言功能,一半是讨论在1和2不可行的情况下需要做什么。

据我所知,您必须通过接口或声明
数据的内联方式声明this.data的“数据类型”。typescript告诉您的是,您已经声明了
数据
为常规对象,但他不知道属性“GetPatientalAddress”是否有效存在,是否是一个函数:断言您必须实现一个接口,当您键入“this.data”时,该接口也将帮助您实现智能感知。如果您希望以内联方式执行此操作,则类似于:
private data:{getPatientalAddress:()}应该可以工作。对于intellisense完成,我建议使用解决方案2,这样,如果您需要保存这样的代码,intellisense将对您有所帮助:)。
getPatientAllAddress:Function
--我认为
(…args:any[])=>any
类型在这种情况下会更好,然后可以进一步拧紧到正确的参数列表和返回类型。我只会在使用任意函数对象时使用
Function
(例如,当需要一个类作为参数时),而绝对不会用于可调用的接口方法。@JohnWeisz我同意,但我不确定哪一个对新手更清楚。如何将noimplicitany设置为false来解决问题?@Shane通过括号访问属性,例如
数据['GetPatientalAddress']
,使用索引签名来提供类型安全性,在接口上定义为
{[key:K]:V}
——例如,字符串数组具有以下索引签名:
{[key:number]:string}
。如果不显式定义索引签名,它将具有隐式的
{[key:any]:any}
类型,并且如果启用了
noImplicitAny
标志(使用该标志,您需要为每个变量/属性/符号指定一个类型),TypeScript将不允许这样做。