Yanıtlar:
Sorunun zaten kapalı olduğunu biliyorum ama aynı TypeScriptException için arama buldum, belki başka biri bu soruyu ararken bu soruyu vurdu.
Sorun eksik TypeScript yazımında yatmaktadır:
var coordinates = outerElement[0].getBBox();
atar The property 'getBBox' does not exist on value of type 'HTMLElement'.
En kolay yol, değişkeni açıkça any
var outerHtmlElement: any = outerElement[0];
var coordinates = outerHtmlElement.getBBox();
TypeScript 1.6 tercih edilen döküm operatörü olduğundan, as
bu satırlar zarif bir şekilde sıkıştırılabilir:
let coordinates = (outerElement[0] as any).getBBox();
Tabii ki bunu doğru yapmak istiyorsanız, bazen aşırıya kaçmak, şunları yapabilirsiniz:
HTMLElement
HTMLElement
getBBox
bir yöntem var mı? türünü öğrenmek ister misiniz getBBox
?
getBBox
olsaydı HTMLElement
, nesneyi ona dökebilirsin var typedElement = <HTMLElement> outerHtmlElement;
.
var coordinates = (<any>outerElement[0]).getBBox();
Hızlı ve kirli çözüm açıkça any
(y as any).x
"Avantaj", kadronun açık olması, bunun noImplicitAny
bayrak kümesi ile bile derlenmesidir .
Uygun çözüm yazım tanımı dosyasını güncellemektir.
Eğer bir değişken döküm zaman, lütfen unutmayın any
, sen çıkmak o değişken için tür denetlemesini.
Sorumluluk reddi modunda olduğum için, any
yeni bir arayüzle kombine edilmiş çift döküm ,
yine de bir tür yazı yazmak istiyorsunuz.
Eğer bir örneği tanımını yama istediğini farz edelim y
Çeşidi OrginalDef
yeni bir mülkle x
Çeşidi number
:
const y: OriginalDef = ...
interface DefWithNewProperties extends OriginalDef {
x: number
}
const patched = y as any as DefWithNewProperties
patched.x = .... //will compile
Aşağıdaki hileyi de kullanabilirsiniz:
y.x = "some custom property"//gives typescript error
y["x"] = "some custom property"//no errors
x
Yine bir daktilo hatası almak ve alamadım unutmayın, böyle yazmak zorunda y["x"]
değil y.x
. Yani bu açıdan diğer seçenekler daha iyi.
:any
?
Bu sorunu çözmenin birkaç yolu vardır. Bu nesne bazı harici kütüphanelerle ilgiliyse, en iyi çözüm, o kütüphane için gerçek tanım dosyasını ( burada büyük depo ) bulmak ve ona referans yapmak olacaktır, örneğin:
/// <reference path="/path/to/jquery.d.ts" >
Tabii ki, bu birçok durumda geçerli değildir.
Tür sistemini 'geçersiz kılmak' istiyorsanız aşağıdakileri deneyin:
declare var y;
Bu, istediğiniz aramaları yapmanızı sağlar var y
.
/// <reference path="/path/to/jquery.d.ts" />
Sonunda kendi kendine kapanan etiketle olmalı
npm install -g tsd
thentsd install jquery
TypeScript "y" üzerinde "x" özelliğinin bulunmadığını düşündüğünde , "y" harfini her zaman "y" üzerinde herhangi bir şeyi ("x" gibi) çağırmanıza olanak tanıyacak şekilde "herhangi bir" öğesine çevirebilirsiniz.
teori
(<any>y).x;
Gerçek Dünya Örneği
Bu kod için "TS2339: 'name' türünde özellik 'name' yok hatası alıyordum:
let name: string = this.constructor.name;
Bu yüzden ile sabitledim:
let name: string = (<any>this).constructor.name;
Angular2 bir sorun vardı, bir şey kaydetmek için yerel depolama kullanıyordum ve bana izin vermedi.
Çözümler:
sahiptim localStorage.city -> error -> Property 'city' does not exist on type 'Storage'.
Nasıl düzeltilir?
localStorage [ 'şehir']
(LocalStorage) 'Kent
(herhangi bir yerel ayar) .city
<any>
- öneki eklerseniz çalışır (<any>localStorage).city
.
Başka hiçbir şeyin işe yaramadığı hızlı bir düzeltme:
const a.b = 5 // error
const a['b'] = 5 // error if ts-lint rule no-string-literal is enabled
const B = 'b'
const a[B] = 5 // always works
İyi bir uygulama değil, dize-değişmez değeri kapatmaya gerek kalmadan bir çözüm sunar
Şimdi 2020 olduğunu biliyorum, ancak sorunun "yoksay" kısmını tatmin eden bir cevap göremedim. Anlaşılan, TSLint'e bir direktif kullanarak bunu yapmasını söyleyebilirsiniz;
// @ts-ignore
this.x = this.x.filter(x => x.someProp !== false);
Normalde bu, 'someProp türünde mevcut değildir' şeklinde bir hata verir. Yorum ile bu hata ortadan kalkar.
Bu, derleme sırasında hataların atılmasını durduracak ve IDE'nizin size şikayet etmesini de durduracaktır.
Ben böyle bir şey kullanarak daktilo bu geçmiş olsun başardı:
let x = [ //data inside array ];
let y = new Map<any, any>();
for (var i=0; i<x.length; i++) {
y.set(x[i], //value for this key here);
}
X içindeki değerleri Y haritası ve derleme için anahtar olarak kullanabilmemin tek yolu gibi görünüyordu.
HTMLElement
, ekgetBBox
özelliğe sahip olan ve ek bir özelliğe sahip bir arabirim de oluşturabilirsiniz . Bu şekilde, diğer özelliklerde kod tamamlamaya devam edersiniz.