Abaikan Kesalahan Teks "properti tidak ada pada nilai tipe"

228

Dalam VS2013 bangunan berhenti ketika tsc keluar dengan kode 1. Ini bukan kasus di VS2012.

Bagaimana saya bisa menjalankan solusi saya sementara mengabaikan kesalahan tsc.exe?

Saya mendapatkan banyak The property 'x' does not exist on value of type 'y'kesalahan, yang ingin saya abaikan saat menggunakan fungsi javascript.

daniel
sumber

Jawaban:

304

Saya tahu pertanyaannya sudah ditutup tetapi saya sudah menemukannya mencari TypeScriptException yang sama, mungkin orang lain memukul pertanyaan ini mencari masalah ini.

Masalahnya terletak pada pengetikan TypeScript yang hilang:

var coordinates = outerElement[0].getBBox();

Melempar The property 'getBBox' does not exist on value of type 'HTMLElement'.


Cara termudah adalah dengan mengetikkan variabel secara eksplisit sebagai any

var outerHtmlElement: any = outerElement[0];
var coordinates = outerHtmlElement.getBBox();

Edit, akhir 2016

Karena TypeScript 1.6 lebih disukai operator casting, asbaris-baris itu dapat disatukan menjadi elegan:

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


Solusi lain

Tentu saja jika Anda ingin melakukannya dengan benar, yang kadang-kadang berlebihan, Anda dapat:

  1. Buat antarmuka sendiri yang cukup diperluas HTMLElement
  2. Perkenalkan pengetikan sendiri yang meluas HTMLElement
michalczukm
sumber
14
Anda juga bisa membuat antarmuka yang memanjang HTMLElementdan memiliki getBBoxproperti tambahan . Dengan begitu Anda masih mendapatkan penyelesaian kode pada properti lainnya.
minggu kedua
alih-alih melakukan apa saja, getBBoxadakah metode yang bisa digunakan dengan benar? ingin mengetahui jenis getBBox?
Pardeep Jain
FE: Jika getBBoxdalam HTMLElementtipe Anda bisa melemparkan objek ke sana oleh var typedElement = <HTMLElement> outerHtmlElement;.
michalczukm
4
bagus! var coordinates = (<any>outerElement[0]).getBBox();
bowpunya
1
Ini sebenarnya tidak menjawab pertanyaan: "Bagaimana MEMPERBAIKI kesalahan"
Petr Peller
123

Solusi cepat dan kotor adalah dengan secara eksplisit dilemparkan ke any

(y as any).x

"Keuntungan" adalah bahwa, pemerannya eksplisit, ini akan dikompilasi bahkan dengan noImplicitAnyset bendera.

Solusi yang tepat adalah memperbarui file definisi pengetikan.

Harap dicatat bahwa, ketika Anda melemparkan variabel ke any, Anda memilih keluar dari jenis memeriksa variabel itu.


Karena saya dalam mode disclaimer, casting ganda melalui anydikombinasikan dengan antarmuka baru, dapat berguna dalam situasi di mana Anda

  • tidak ingin memperbarui file pengetikan yang rusak
  • sedang menambal monyet

namun, Anda masih menginginkan beberapa bentuk pengetikan.

Katakanlah Anda ingin menambal definisi instance ydari tipe OrginalDefdengan properti xtipe baru number:

const y: OriginalDef = ...

interface DefWithNewProperties extends OriginalDef {
    x: number
}

const patched = y as any as DefWithNewProperties

patched.x = ....   //will compile
Bruno Grieder
sumber
terima kasih telah membantu ini: impor http = memerlukan ('http'); var server = http apa saja; server.Server (aplikasi); // abaikan kesalahan ts!
scape
Saya menggunakan ini di "memastikan properti tidak ditemukan di NodeRequire". jadi saya menyatakan variabel yang saya butuhkan pada NodeRequired dan (wajib seperti apa pun) .ureure untuk properti. Semoga ini membantu.
Juni Brosas
61

Anda juga dapat menggunakan trik berikut:

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

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

Perhatikan, bahwa untuk mengakses xdan tidak mendapatkan kesalahan naskah lagi Anda harus menulis seperti itu y["x"], bukan y.x. Jadi dari perspektif ini pilihan lain lebih baik.

Yaroslav Yakovlev
sumber
4
Adakah yang tahu mengapa ini bekerja, dan jika ini memiliki potensi konsekuensi atau manfaat dibandingkan dengan menyatakan objek pada awalnya :any?
mcheah
Itu akan memiliki manfaat yang jelas dari menjaga pengetikan, daripada melakukan casting ke semua. Saya ingin tahu mengapa ini tidak memberikan peringatan tetapi mengakses langsung tidak ..
Powderham
38

Ada beberapa cara untuk mengatasi masalah ini. Jika objek ini terkait dengan beberapa pustaka eksternal, solusi terbaik adalah menemukan file definisi aktual (repositori hebat di sini ) untuk pustaka itu dan merujuknya, misalnya:

/// <reference path="/path/to/jquery.d.ts" >

Tentu saja, ini tidak berlaku dalam banyak kasus.

Jika Anda ingin 'mengganti' sistem jenis, coba yang berikut ini:

declare var y;

Ini akan memungkinkan Anda melakukan panggilan apa pun yang Anda inginkan var y.

Charles Marsh
sumber
5
Harus /// <reference path="/path/to/jquery.d.ts" />dengan tag penutup diri di akhir
tic
Saya menggunakan VS2015 dan mengikuti tutorial ini untuk sudut saya tidak punya jquery.d.tsfile di proyek saya
Dimple
@Dimple npm install -g tsdthentsd install jquery
Akash
Opsi kedua (menyatakan var y) berfungsi dengan baik jika Anda bermigrasi dari JavaScript ke TypeScript, dan ingin menghindari kesalahan TS2304 karena JavaScript lama Anda mereferensikan variabel dalam file JavaScript lain.
yesman
Terima kasih! Bagi saya masalahnya adalah dengan Jest, const mockPrompt: any = jest.spyOn (step, 'prompt');
Mark Robson
18

Ketika TypeScript berpikir bahwa properti "x" tidak ada pada "y" , maka Anda selalu dapat memasukkan "y" ke "any", yang akan memungkinkan Anda untuk memanggil apa pun (seperti "x") pada "y".

Teori

(<any>y).x;

Contoh Dunia Nyata

Saya mendapatkan kesalahan "TS2339: Properti 'nama' tidak ada pada tipe 'Fungsi'" untuk kode ini:

let name: string = this.constructor.name;

Jadi saya memperbaikinya dengan:

let name: string = (<any>this).constructor.name;
Benny Neugebauer
sumber
1
Tidak bekerja dengan super. Jika Anda memperpanjang kelas menggunakan pengetikan dan penulis lupa metode publik Anda cukup banyak yang kacau. Anda harus menambahkannya ke definisi tipe, yang dihentikan pada instalasi npm berikutnya, memaksa Anda untuk membuat permintaan tarik atau memberi tahu penulis, yang mungkin merupakan hal yang baik tetapi menyusahkan.
Corey Alix
15

Punya masalah di Angular2, saya menggunakan penyimpanan lokal untuk menyimpan sesuatu dan itu tidak akan membiarkan saya.

Solusi:

Saya punya localStorage.city -> error -> Property 'city' does not exist on type 'Storage'.

Bagaimana memperbaikinya:

localStorage ['city']

(localStorage) .city

(Penyimpanan lokal seperti) .City

Avram Virgil
sumber
Opsi kedua terlihat keren, tetapi tampaknya tidak melakukan pekerjaan lagi. Bekerja jika Anda mengawali objek dengan <any>- (<any>localStorage).city.
jayarjo
Saya tahu ini sudah tua tetapi contoh teratas Anda hanya bekerja untuk saya .. Bagus sekali.
MacD
4

Perbaikan cepat tempat tidak ada lagi yang berfungsi:

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

Bukan praktik yang baik tetapi memberikan solusi tanpa harus mematikan no-string-literal

danday74
sumber
Saya melakukan ini juga, tetapi beberapa platform (seperti Google Cloud) akan memunculkan pesan peringatan yang menunjukkan bahwa ab lebih baik daripada ['b']. Apakah Anda tahu mengapa ini terjadi?
Jonathan
1
Tidak yakin tetapi Anda bisa, di tslint.json misalnya, mengubah opsi sehingga lebih suka ab
danday74
3

Saya tahu sekarang tahun 2020, tetapi saya tidak bisa melihat jawaban yang memuaskan bagian "abaikan" dari pertanyaan itu. Ternyata, Anda dapat memberitahu TSLint untuk melakukan hal itu menggunakan arahan;

// @ts-ignore
this.x = this.x.filter(x => x.someProp !== false);

Biasanya ini akan menimbulkan kesalahan, menyatakan bahwa 'someProp tidak ada pada tipe'. Dengan komentar, kesalahan itu hilang.

Ini akan menghentikan kesalahan yang terjadi saat kompilasi dan juga harus menghentikan IDE Anda yang mengeluh kepada Anda.

Lewis
sumber
0

Dalam proyek khusus saya, saya tidak bisa membuatnya bekerja, dan digunakan declare var $;. Bukan solusi bersih / direkomendasikan, itu tidak mengenali variabel JQuery, tapi saya tidak punya kesalahan setelah menggunakan itu (dan harus untuk membangun otomatis saya untuk berhasil).

Randy
sumber
0

Saya bisa melewati ini dalam naskah menggunakan sesuatu seperti:

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

Ini sepertinya satu-satunya cara saya bisa menggunakan nilai-nilai di dalam X sebagai kunci untuk peta Y dan kompilasi.

cs_pupil
sumber