TypeScript: Eigenschaft existiert nicht für Typ '{}'


75

Ich verwende Visual Studio 2013 vollständig gepatcht. Ich versuche, JQuery, JQueryUI und JSRender zu verwenden. Ich versuche auch, TypeScript zu verwenden. In der ts-Datei wird folgende Fehlermeldung angezeigt:

Die Eigenschaft 'fadeDiv' ist für den Typ '{}' nicht vorhanden.

Ich glaube, ich habe die richtigen Referenzen für JQuery, JQueryUI und JSRender für TypeScript, aber nach dem, was ich gelesen habe, sieht dies wie ein d.ts-Problem aus.

Es gibt keine Fehler in JavaScript, aber ich möchte nicht, dass Visual Studio sagt, dass es Fehler gibt, wenn ich helfen kann. Beide Male fadeDivwird im JavaScript erwähnt, dass sich darunter eine rote Linie befindet und beide Fehler dasselbe wie oben aussagen.

/// <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');
            }
        }
    });
});

Für diejenigen, die dies später lesen könnten, ist das SUCSS der Namespace. In Typoskript scheint es, als hätte ich so etwas machen wollen.

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

Die Funktion wird also mithilfe des Exports veröffentlicht, und ich kann das aufrufen SUCSS.fadeDiv, um beim Laden der Seite ausgeführt zu werden, indem ich es mit dem aufrufe SUCSS.fadeDiv();. Ich hoffe das wird hilfreich sein.


1
Sie scheinen zumindest die schließende }Klammer und vielleicht anderen Code zu vermissen .
mk.

Sie müssen diesen Code auf ein in sich geschlossenes Beispiel reduzieren, damit die Benutzer das Problem tatsächlich reproduzieren können. Derzeit werden unzählige Variablen verwendet, für die es keine Definitionen gibt. Daher können wir nur deren Typen erraten.
Ryan Cavanaugh

Antworten:


116

Sie können anydem Objekt den Typ zuweisen :

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

6
Es ist besser, die Syntax any zu verwenden: let bar = {} as any; bar.foo = "foobar";
eKelvin

8
Ich bevorzugelet bar: any = {};
Maor Refaeli

39

Greifen Sie mit Array-Notation auf das Feld zu, um eine strikte Typprüfung für ein einzelnes Feld zu vermeiden:

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

Alternativ können Sie die Variable für den Einzelzugriff (un) umwandeln:

(<any>data).propertyName;//access propertyName like if data has no type

Der erste ist kürzer, der zweite ist expliziter in Bezug auf Typ- (Un-) Casting


Sie können die Typprüfung auch für alle Variablenfelder vollständig deaktivieren:

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

Hinweis: Dies wäre gefährlicher, als die Typprüfung nur für einen einzelnen Feldzugriff zu vermeiden, da alle aufeinander folgenden Zugriffe auf alle Felder untypisiert sind


1
Was bringt es, TypeScript zu verwenden, wenn wir es nur mit solchen Hacks umgehen wollen?
Damien Roche

3
Die Typoskript-Typprüfung ist nicht streng und obligatorisch. Sie ist wie eine starke Empfehlung. Sie können sie jederzeit umgehen, indem Sie einfach <any> hinzufügen. Oft müssen Sie dies tun, da Sie im Web mit Javascript-Bibliotheken, untypisiertem json APIS und dynamisch generierten Objekten interagieren. In solchen Fällen müssen Sie ausnahmsweise in der Lage sein, solche Funktionen zu verwenden. Formal wird dies als Reflektion bezeichnet und ist eine Funktionalität, die auch Java bietet. Daher wird weder Java noch C # verwendet
Luca C.

20
let propertyName= data['propertyName'];

1
Das war der einzige, der mein Kompilierungsproblem wirklich gelöst hat. Sogar das Deklarieren wie Abschnitt: {Jahr: beliebig} [] hat Fehler gemacht: Eigenschaft 'Jahr' existiert nicht für Typ '{Jahr: Nummer; } [] '.
Paweł Stolka

13

Wenn Sie die folgende Codezeile in TypeScript schreiben:

var SUCSS = {};

Der Typ von SUCSSwird aus der Zuordnung abgeleitet (dh es handelt sich um einen leeren Objekttyp).

Einige Zeilen später fügen Sie diesem Typ eine Eigenschaft hinzu:

SUCSS.fadeDiv = //...

Und der Compiler warnt Sie, dass fadeDivfür das SUCSSObjekt keine Eigenschaft benannt ist (diese Art von Warnung hilft Ihnen häufig dabei, einen Tippfehler zu erkennen).

Sie können entweder ... das Problem beheben, indem Sie den Typ von angeben SUCSS(obwohl dies Sie daran hindert, zuzuweisen {}, was dem gewünschten Typ nicht entspricht):

var SUCSS : {fadeDiv: () => void;};

Oder indem Sie zuerst den vollständigen Wert zuweisen und TypeScript die Typen ableiten lassen:

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

6

Ich schlage die folgende Änderung vor

let propertyName =  {} as any;

1
Willkommen bei SO, Kovacs! Bitte bearbeiten Sie Ihre Antwort so, dass sie eine kurze einleitende Paragraphie enthält, die sich auf die gestellte Frage bezieht. Darüber hinaus wäre eine kurze Erklärung cool, warum Ihre Antwort das Problem löst.
B - rian

1
Ich mag diese Lösung viel besser als die anderen genannten.
wvdz

0

Am oberen Rand der Datei müssen Sie var fadeDiv = ...stattdessen schreiben, fadeDiv = ...damit die Variable tatsächlich deklariert wird.

Der Fehler " Property 'fadeDiv' does not exist on type '{}'." scheint in einer Zeile ausgelöst zu werden, die Sie in Ihrem Beispiel nicht gepostet haben (es gibt keinen Zugriff auf eine fadeDivEigenschaft in diesem Snippet).


Entschuldigung. Hier ist der vollständige Code. Im Beispiel wurde nur ein Namespace ausgelassen, aber der Fehler ist der gleiche. Der Fehler tritt bei SUCSS.fadeDiv () auf. beim Laden des Dokuments und auch in der Zeile SUCSS.fadeDiv = function () {.
jvcoach23

Es ist keine große Verbesserung, weil Sie die Definition von auch nicht veröffentlicht haben SUCSS...
Ryan Cavanaugh

0
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;
      }
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.