类型"{}"上不存在属性

jvc*_*h23 54 typescript

我正在使用Visual Studio 2013完全修补.我有一个我刚刚创建的网站,我正在尝试使用jquery,jqueryui和jsrender.我也在尝试使用TypeScript.在ts文件中我收到如下错误

属性'fadeDiv'在类型'{}'上不存在.

我有正确的参考资料,我认为jquery,jqueryui和jsrender for typescript ..但是从我所看到的这看起来像是一个d.ts问题.希望有人可以帮助我.

在javascript中没有错误,但我不想让Visual Studio说如果我能帮助它就会有错误.两次fadeDiv都在javascript中提到它下面有一条红线,两个错误都说明与上面相同.

谢谢香农

/// <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');
            }
        }
    });
});
Run Code Online (Sandbox Code Playgroud)

对于那些可能稍后阅读过的人... SUCSS命名空间..在打字稿中看起来我会想要做这样的事情.

$(document).ready(function () {
    SUCSS.fadeDiv();
});
module SUCSS {
    export function fadeDiv () {};
};
Run Code Online (Sandbox Code Playgroud)

因此,通过使用导出使该函数公开,我可以通过使用SUCSS.fadeDiv()调用它来调用SUCSS.fadeDiv在页面加载上运行; 希望能有所帮助.

21s*_*1st 86

只需将任何类型分配给对象:

let bar = <any>{};
bar.foo = "foobar"; 
Run Code Online (Sandbox Code Playgroud)

  • 我更喜欢 `let bar: any = {};` (9认同)
  • 最好使用任何语法:let bar = {} as any; bar.foo ="foobar"; (3认同)

Luc*_* C. 25

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

data['propertyName']; //will work even if data has not declared propertyName
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

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

  • Typescript 类型检查不是严格和强制性的,它就像一个强烈的推荐,你可以在任何时候通过简单地添加 &lt;any&gt; 来绕过它。通常你必须这样做,因为在 web 中你会与 javascript 库、无类型的 json APIS 和动态生成的对象进行交互。在这种情况下,例外情况下,您必须能够使用这样的功能,正式称为反射,并且是 Java 也具有的功能,因此既不使用 Java 也不使用 C# (5认同)
  • 如果我们只是想用这样的黑客来规避它,那么使用 TypeScript 有什么意义呢? (2认同)

Amr*_*him 14

let propertyName= data['propertyName'];
Run Code Online (Sandbox Code Playgroud)


Fen*_*ton 12

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

var SUCSS = {};
Run Code Online (Sandbox Code Playgroud)

SUCSS从赋值推断出类型(即它是一个空对象类型).

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

SUCSS.fadeDiv = //...
Run Code Online (Sandbox Code Playgroud)

并且编译器警告您fadeDivSUCSS对象上没有命名属性(这种警告通常可以帮助您捕获拼写错误).

您可以...通过指定类型来修复它SUCSS(虽然这会阻止您分配{},但不满足您想要的类型):

var SUCSS : {fadeDiv: () => void;};
Run Code Online (Sandbox Code Playgroud)

或者通过首先分配完整值并让TypeScript推断出类型:

var SUCSS = {
    fadeDiv: function () {
        // Simplified version
        alert('Called my func');
    }
};
Run Code Online (Sandbox Code Playgroud)


Bot*_*ond 8

我建议进行以下更改

let propertyName =  {} as any;
Run Code Online (Sandbox Code Playgroud)


小智 6

您可以使用部分实用程序类型使所有对象属性成为可选。 https://www.typescriptlang.org/docs/handbook/utility-types.html#partialtype

type Foo = {
  bar: string;
}

const foo: Partial<Foo> = {}
foo.bar = "foobar"
Run Code Online (Sandbox Code Playgroud)


Rya*_*ugh 0

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

错误“ Property 'fadeDiv' does not exist on type '{}'.”似乎是在您的示例中未发布的行上触发的(fadeDiv该代码段中的任何位置都无法访问属性)。