Daktilo Hataları Hatalarını Yoksay “özellik türünde özellik yok”


228

VS2013'te tsc kod 1 ile çıktığında bina durur. VS2012'de durum böyle değildi.

Tsc.exe hatasını yoksayarken çözümümü nasıl çalıştırabilirim?

The property 'x' does not exist on value of type 'y'Javascript işlevlerini kullanırken yoksaymak istediğiniz birçok hata alıyorum.

Yanıtlar:


305

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();

Düzenle, 2016 sonu

TypeScript 1.6 tercih edilen döküm operatörü olduğundan, asbu satırlar zarif bir şekilde sıkıştırılabilir:

let coordinates = (outerElement[0] as any).getBBox();


Diğer çözümler

Tabii ki bunu doğru yapmak istiyorsanız, bazen aşırıya kaçmak, şunları yapabilirsiniz:

  1. Kolayca uzanan kendi arayüzü oluşturun HTMLElement
  2. Genişleyen kendi yazımını tanıtın HTMLElement

14
Ayrıca HTMLElement, ek getBBoxözelliğe sahip olan ve ek bir özelliğe sahip bir arabirim de oluşturabilirsiniz . Bu şekilde, diğer özelliklerde kod tamamlamaya devam edersiniz.
thetallweeks

içine döküm yerine yerine döküm için herhangi getBBoxbir yöntem var mı? türünü öğrenmek ister misiniz getBBox?
Pardeep Jain

FE: Eğer tipte getBBoxolsaydı HTMLElement, nesneyi ona dökebilirsin var typedElement = <HTMLElement> outerHtmlElement;.
michalczukm

4
Güzel! var coordinates = (<any>outerElement[0]).getBBox();
bowpunya

1
Bu aslında şu soruya cevap vermez: "Hatalar nasıl yapılır?"
Petr Peller

123

Hızlı ve kirli çözüm açıkça any

(y as any).x

"Avantaj", kadronun açık olması, bunun noImplicitAnybayrak 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, anyyeni bir arayüzle kombine edilmiş çift ​​döküm ,

  • bozuk bir daktilo dosyasını güncellemek istemiyorum
  • maymun yama yapıyor mu

yine de bir tür yazı yazmak istiyorsunuz.

Eğer bir örneği tanımını yama istediğini farz edelim yÇeşidi OrginalDefyeni 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

teşekkürler bu yardımcı oldu: import http = requir ('http'); var sunucu = http herhangi bir şekilde; server.Server (uygulama); // ts hatalarını yok sayar!
scape

Ben "NodeRequire özelliği bulunamadı sağlamak" bunu kullandım. Bu yüzden NodeRequired benim istek değişkeni ve (herhangi bir gerektiren) .ensure özelliği için ilan etti. Bu yardımcı olur umarım.
Juni Brosas

61

Aşağıdaki hileyi de kullanabilirsiniz:

y.x = "some custom property"//gives typescript error

y["x"] = "some custom property"//no errors

xYine 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.


4
Bunun neden işe yaradığını bilen var mı ve bunun başlangıçta nesneyi olarak ilan etmenin herhangi bir olası etkisi veya faydası varsa :any?
mcheah

Herhangi birine döküm yapmaktansa, yazımları muhafaza etmede açık bir yararı olacaktır. Bunun neden bir uyarı atmadığını ama doğrudan erişmenin nedenini bilmek istiyorum ..
Powderham

38

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.


5
/// <reference path="/path/to/jquery.d.ts" />Sonunda kendi kendine kapanan etiketle olmalı
tic

VS2015 kullanıyorum ve açısal için bu öğretici takip benim projemde jquery.d.tsdosya yok
Dimple

@Simple npm install -g tsdthentsd install jquery
Akash,

JavaScript'ten TypeScript'e geçiş yapıyorsanız ve eski JavaScript'iniz başka bir JavaScript dosyasındaki bir değişkene başvurduğu için ikinci seçenek (declare var y) harika çalışıyor.
yesman

Teşekkürler! Benim için sorun Jest'ti, const mockPrompt: any = jest.spyOn (adım, 'istem');
Mark Robson

18

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;

1
Süper ile çalışmaz. Bir sınıfı yazımları kullanarak genişletirseniz ve yazar herkese açık bir yöntemi unutursa hemen hemen mahvoldunuz. Bir sonraki npm kurulumunda durdurulan tür tanımına eklemeniz gerekir, bir çekme isteği oluşturmaya veya yazarı başka bir şekilde bilgilendirmeye zorlarsınız, ki bu muhtemelen iyi bir şey ama bir acıdır.
Corey Alix

15

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


İkinci seçenek harika görünüyor, ancak artık işi yapmıyor gibi görünüyor. Bir nesneye <any>- öneki eklerseniz çalışır (<any>localStorage).city.
jayarjo

Bunun eski olduğunu biliyorum ama en iyi örneğin benim için çalıştı.
MacD

4

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


Bunu ben de yapıyorum ama bazı platformlar (Google Cloud gibi) ab'nin bir ['b'den] daha iyi olduğunu belirten bir uyarı mesajı verecektir. Bunun neden olduğunu biliyor musun?
Jonathan

1
Emin değilim, ancak tslint.json'da seçenekleri ab
danday74

3

Ş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.


0

Özel projemde işe yaramadım ve kullandım declare var $;. Temiz / önerilen bir çözüm değil, JQuery değişkenleri tanımıyor, ancak bunu kullandıktan sonra hiçbir hata yoktu (ve benim otomatik derlemeler başarılı olmak zorunda).


0

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.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.