TypeScript: Özellik '{}' tipinde mevcut değildir
Tamamen güncellenmiş Visual Studio 2013 kullanıyorum. JQuery, JQueryUI ve JSRender kullanmaya çalışıyorum. Ayrıca TypeScript kullanmaya da çalışıyorum. ts dosyasında aşağıdaki hatayı alıyorum:
‘fadeDiv’ özelliği ‘{}’ türünde mevcut değil.
Sanırım TypeScript için JQuery, JQueryUI ve JSRender için doğru referanslara sahibim, ama okuduklarıma göre bu bir d.ts sorunu gibi görünüyor.
JavaScript'te hiç hata yok, ama eğer mümkünse Visual Studio'nun hata olduğunu söylemesini istemiyorum. JavaScript'te fadeDiv iki kez geçtiğinde altında kırmızı bir çizgi var ve her iki hata da yukarıda belirtilenle aynı şeyi söylüyor.
/// <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');
}
}
});
});
Bunu daha sonra okuyabilecek olanlar için, SUCSS namespace'dir. Typescript'te sanırım şöyle bir şey yapmak isterdim.
$(document).ready(function () {
SUCSS.fadeDiv();
});
module SUCSS {
export function fadeDiv () {};
};
Yani fonksiyon, export kullanılarak public hale getiriliyor ve SUCSS.fadeDiv'i sayfa yüklenirken çalıştırmak için SUCSS.fadeDiv(); şeklinde çağırabilirim. Umarım bu faydalı olur.
Cevap #1
Nesneye any türünü atayabilirsiniz:
let bar: any = {};
bar.foo = "foobar";
Cevap #2
Tek bir alan üzerinde sıkı tür denetiminden kaçınmak için alanı dizi gösterimi ile erişin:
data['propertyName']; //will work even if data has not declared propertyName
Alternatif yol, değişkeni tek erişim için (dönüştürmek) (dönüştürmemek)tir:
(<any>data).propertyName;//access propertyName like if data has no type
İlki daha kısa, ikincisi tür (dönüştürme) hakkında daha açıklayıcı.
Tüm değişken alanlarında tür denetimini tamamen devre dışı da bırakabilirsiniz:
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
Not: Bu, sadece tek bir alan erişimi için tür denetiminden kaçınmaktan daha tehlikeli olur, çünkü tüm alanlardaki tüm ardışık erişimler türsüzdür.
Cevap #3
let propertyName = data['propertyName'];
Cevap #4
TypeScript'te aşağıdaki kod satırını yazdığınızda:
var SUCSS = {};
SUCSS türü atamadan çıkarılır (yani boş bir nesne türüdür).
Daha sonra birkaç satır ileride bu tipe bir özellik ekliyorsunuz:
SUCSS.fadeDiv = //...
Ve derleyici, SUCSS nesnesinde fadeDiv adında bir özellik olmadığını size bildirir (bu tür bir uyarı genellikle bir yazım hatasını yakalamanıza yardımcı olur).
Bunu ya... SUCSS tipini belirterek düzeltebilirsiniz (her ne kadar bu, istediğiniz tipe uymayan {} atamanızı engellese de):
var SUCSS : {fadeDiv: () => void;};
Veya tamamen değeri baştan atayıp TypeScript'in türleri çıkarmasına izin vererek:
var SUCSS = {
fadeDiv: function () {
// Simplified version
alert('Called my func');
}
};
Cevap #5
Aşağıdaki değişikliği öneriyorum
let propertyName = {} as any;
