TypeScript:类型';上不存在属性;{}';

TypeScript:类型';上不存在属性;{}';,typescript,Typescript,我正在使用Visual Studio 2013完全修补。我正在尝试使用JQuery、JQueryUI和JSRender。我也在尝试使用TypeScript。在ts文件中,我得到一个错误,如下所示: 类型“{}”上不存在属性“fadeDiv” 我认为我有正确的JQuery、JQueryUI和TypeScript的JSRender引用,但从我所读到的内容来看,这看起来像是一个d.ts问题 JavaScript中没有错误,但如果我可以帮助的话,我不想让VisualStudio说有错误。JavaScri

我正在使用Visual Studio 2013完全修补。我正在尝试使用JQuery、JQueryUI和JSRender。我也在尝试使用TypeScript。在ts文件中,我得到一个错误,如下所示:

类型“{}”上不存在属性“fadeDiv”

我认为我有正确的JQuery、JQueryUI和TypeScript的JSRender引用,但从我所读到的内容来看,这看起来像是一个d.ts问题

JavaScript中没有错误,但如果我可以帮助的话,我不想让VisualStudio说有错误。JavaScript中提到的两次
fadeDiv
,下面都有一条红线,两个错误都表示与上面相同的内容

/// <reference path="../scripts/typings/jquery/jquery.d.ts" />
/// <reference path="../scripts/typings/jqueryui/jqueryui.d.ts" />
/// <reference path="typings/jsrender/jsrender.d.ts" />

var SUCSS = {};

$(document).ready(function () {
   SUCSS.fadeDiv();
});

SUCSS.fadeDiv = function () {
var mFadeText: number;
$(function () {
    var mFade = "FadeText";
    //This part actually retrieves the info for the fadediv
    $.ajax({
        type: "POST",
        //url: "/js/General.aspx/_FadeDiv1",
        url: "/js/sucss/General.aspx/_FadeDivList",
        //data: "{'iInput':" + JSON.stringify(jInput) + "}",
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        error: function (xhr, status, error) {
            // Show the error
            //alert(xhr.responseText);
        },
        success: function (msg) {
            mFadeText = msg.d.Fade;
            // Replace the div's content with the page method's return.
            if (msg.d.FadeType == 0) {//FadeDivType = List
                var template = $.templates("#theTmpl");
                var htmlOutput = template.render(msg.d);
                $("[id$=lblFadeDiv]").html(htmlOutput);
            }
            else {//FadeDivType = String
                $("[id$=lblFadeDiv]").html(msg.d.FadeDivString);
            }
        },
        complete: function () {
            if (mFadeText == 0) {
                $("[id$=lblFadeDiv]").fadeIn('slow').delay(5000).fadeOut('slow');
            }
        }
    });
});

因此,该函数通过使用导出公开,我可以调用
SUCSS.fadeDiv
在页面加载时运行,方法是使用
SUCSS.fadeDiv()调用它。我希望这会有所帮助。

在文件顶部附近,您需要编写
var fadeDiv=…
而不是
fadeDiv=…
,以便实际声明变量


错误“
属性'fadeDiv'在类型“{}”上不存在。
”似乎是在示例中未发布的行上触发的(在该代码段的任何地方都无法访问
fadeDiv
属性)。

当您在TypeScript中编写以下代码行时:

var SUCSS = {};
SUCSS
的类型是从赋值中推断出来的(即,它是一个空对象类型)

几行之后,您将继续向该类型添加属性:

SUCSS.fadeDiv = //...
编译器会警告您,在
SUCSS
对象上没有名为
fadeDiv
的属性(这种警告通常有助于您捕获输入错误)

你可以。。。通过指定
SUCSS
的类型来修复它(尽管这将阻止您分配
{}
,这不满足您想要的类型):

或者,首先指定完整值,然后让TypeScript推断类型:

var SUCSS = {
    fadeDiv: function () {
        // Simplified version
        alert('Called my func');
    }
};

您可以为对象指定
any
类型:

let bar: any = {};
bar.foo = "foobar"; 

使用数组表示法访问字段,以避免对单个字段进行严格的类型检查:

data['propertyName']; //will work even if data has not declared propertyName

另一种方法是(取消)为单个访问强制转换变量:

(<any>data).propertyName;//access propertyName like if data has no type
(数据).propertyName//访问propertyName,就像数据没有类型一样
第一个较短,第二个关于类型(非)转换更明确


您还可以完全禁用所有变量字段的类型检查:

let untypedVariable:any= <any>{}; //disable type checking while declaring the variable
untypedVariable.propertyName = anyValue; //any field in untypedVariable is assignable and readable without type checking
let untypedVariable:any={}//声明变量时禁用类型检查
untypedVariable.propertyName=anyValue//非TypedVariable中的任何字段都是可赋值的,无需进行类型检查即可读取

注意:这比仅针对单个字段访问避免类型检查更危险,因为所有字段上的所有连续访问都是非类型的

let propertyName =  {} as any;

您似乎至少缺少了结束语
}大括号,可能还缺少其他代码。您需要将此代码简化为一个自包含的示例,以便人们能够实际重现问题。就目前而言,您使用了大量没有定义的变量,因此我们只能猜测它们的类型。很抱歉。。这是完整的代码。。。只是在示例中遗漏了一个名称空间,但错误是相同的。错误发生在SUCSS.fadeDiv()上;在文档加载和SUCSS.fadeDiv=function(){line中,这没有多大改进,因为您还没有发布
SUCSS
的定义……最好使用any语法:let bar={}as any;bar.foo=“foobar”;我更喜欢
let bar:any={}
如果我们只是想用这样的黑客来绕过TypeScript,那么使用TypeScript有什么意义呢?TypeScript类型检查不是严格的、强制性的,它就像一个强烈的建议,你可以通过简单的添加随时绕过它。通常你必须这样做,因为在web上你与javascript库、非类型化的json API交互S和动态生成的对象。在这种情况下,例外情况下,您必须能够使用这样的功能,正式地说,这被称为反射,而且Java也具有这一功能,因此既不使用Java也不使用C#欢迎使用so,Kovacs!请编辑您的答案,使其确实包含与除此之外,一个简单的解释会很酷,为什么你的答案解决了这个问题。我比前面提到的其他解决方案更喜欢这个解决方案。这是唯一一个真正解决了我的编译问题的解决方案。即使声明类似的节:{year:any}[]犯了错误:属性'year'在类型{year:Number;}上不存在[]'.
(<any>data).propertyName;//access propertyName like if data has no type
let untypedVariable:any= <any>{}; //disable type checking while declaring the variable
untypedVariable.propertyName = anyValue; //any field in untypedVariable is assignable and readable without type checking
let propertyName =  {} as any;
myFunction(
        contextParamers : {
            param1: any,
            param2: string
            param3: string          
        }){
          contextParamers.param1 = contextParamers.param1+ 'canChange';
          //contextParamers.param4 = "CannotChange";
          var contextParamers2 : any = contextParamers;// lost the typescript on the new object of type any
          contextParamers2.param4 =  'canChange';
          return contextParamers2;
      }