প্রকারভেদ ত্রুটিগুলি উপেক্ষা করুন "ধরণের মানের উপর সম্পত্তি বিদ্যমান নেই"


227

ভিএস ২০১৩-তে বিল্ডিং বন্ধ হয়ে যায় যখন টিএসসি কোড ১ দিয়ে প্রস্থান করে V ভিএস ২০১২-এ এটি ছিল না।

Tsc.exe ত্রুটি উপেক্ষা করার সময় আমি কীভাবে আমার সমাধান চালাতে পারি?

আমি অনেক The property 'x' does not exist on value of type 'y'ত্রুটি পেয়েছি, যা জাভাস্ক্রিপ্ট ফাংশন ব্যবহার করার সময় উপেক্ষা করতে চাই।

উত্তর:


303

আমি জানি যে প্রশ্নটি ইতিমধ্যে বন্ধ আছে তবে আমি এটি একই টাইপস্ক্রিপ্ট এক্সসেপশন অনুসন্ধান করে দেখতে পেয়েছি, সম্ভবত এই সমস্যাটির সন্ধানে অন্য কেউ এই প্রশ্নটিকে আঘাত করেছেন।

সমস্যাটি হ'ল টাইপস্ক্রিপ্ট টাইপিংয়ের মধ্যে রয়েছে:

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

ছোঁড়ার The property 'getBBox' does not exist on value of type 'HTMLElement'.


সবচেয়ে সহজ উপায় হ'ল সুস্পষ্টভাবে ভেরিয়েবল হিসাবে টাইপ করা any

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

2016 এর শেষের দিকে সম্পাদনা করুন

যেহেতু টাইপস্ক্রিপ্ট ১.6 asপছন্দের ingালাই অপারেটর সেই লাইনগুলিকে মার্জিত মধ্যে স্কোয়াশশেড করা যায়:

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


অন্যান্য সমাধান

অবশ্যই যদি আপনি এটি সঠিকভাবে করতে চান যা কখনও কখনও ওভারকিল হয় তবে আপনি এটি করতে পারেন:

  1. নিজস্ব ইন্টারফেস তৈরি করুন যা কেবল প্রসারিত হয় HTMLElement
  2. প্রসারিত নিজস্ব টাইপিং পরিচয় করিয়ে দিন HTMLElement

14
আপনি এমন একটি ইন্টারফেসও তৈরি করতে পারেন HTMLElementযা বাড়তি getBBoxসম্পত্তি প্রসারিত করে । এইভাবে আপনি অন্যান্য বৈশিষ্ট্যগুলিতে কোড সমাপ্তি পেতে পারেন।
Thetallweeks

পরিবর্তে কারও কাছে getBBoxingালার পরিবর্তে প্রোপাই কাস্ট করার কোনও পদ্ধতি আছে? এর ধরণের সন্ধান করতে চান getBBox?
পারদীপ জৈন

ফাঃ: যদি getBBoxহবে HTMLElementটাইপ আপনি এটি বস্তুর নিক্ষেপ পারে var typedElement = <HTMLElement> outerHtmlElement;
michalczukm

4
চমৎকার! var coordinates = (<any>outerElement[0]).getBBox();
বোঁপুনিয়া

1
"কিভাবে ত্রুটি উপেক্ষা করার": এটি আসলে প্রশ্নের উত্তর নেই
পেত্র Peller

121

দ্রুত এবং নোংরা সমাধানটি স্পষ্টভাবে কাস্ট করা any

(y as any).x

"সুবিধা "টি হ'ল, castালাই সুস্পষ্ট হয়ে উঠেছে, এটি noImplicitAnyপতাকা সেট দিয়েও সংকলন করবে ।

সঠিক সমাধানটি টাইপিং সংজ্ঞা ফাইল আপডেট করা।

দয়া করে মনে রাখবেন, যখন আপনি একটি পরিবর্তনশীল নিক্ষেপ any, আপনি অনির্বাচন যে পরিবর্তনশীল জন্য টাইপ পরীক্ষণ করুন।


যেহেতু আমি অস্বীকৃতি মোডে আছি, তাই anyনতুন ইন্টারফেসের সাথে একত্রে ডাবল কাস্টিং আপনার ক্ষেত্রে এমন পরিস্থিতিতে কার্যকর হতে পারে

  • একটি ভাঙা টাইপিং ফাইল আপডেট করতে চান না
  • বানর প্যাচিং হয়

তবুও, আপনি এখনও টাইপিং কিছু ফর্ম চান।

তোমাদের মধ্যে একটি দৃষ্টান্ত সংজ্ঞা প্যাচ করতে চান বলুন yধরণ OrginalDefএকটি নতুন সম্পত্তি সঙ্গে xধরনের number:

const y: OriginalDef = ...

interface DefWithNewProperties extends OriginalDef {
    x: number
}

const patched = y as any as DefWithNewProperties

patched.x = ....   //will compile

ধন্যবাদ এটি সাহায্য করেছে: আমদানি করুন http = প্রয়োজনীয় ('http'); var সার্ভার = কোনও হিসাবে http; server.Server (অ্যাপ); // টিএস ত্রুটি উপেক্ষা করে!
স্কেপ

আমি এটি "নোডরেকায়ারে সম্পত্তি খুঁজে পাওয়া যায় না তা নিশ্চিত করে" ব্যবহার করেছিলাম। সুতরাং আমি নোডরেকায়ার্ডে আমার প্রয়োজনীয় পরিবর্তনশীল এবং (কোনও হিসাবে প্রয়োজনীয়) সম্পত্তির জন্য বীমা ঘোষণা করেছি। আশাকরি এটা সাহায্য করবে.
জুনি ব্রোসাস

61

আপনি নিম্নলিখিত কৌশলটি ব্যবহার করতে পারেন:

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

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

দ্রষ্টব্য, অ্যাক্সেস করতে xএবং আবার কোনও টাইপ স্ক্রিপ্ট ত্রুটি না পেতে আপনার এটিকে এটি লিখতে হবে y["x"], না y.x। সুতরাং এই দৃষ্টিকোণ থেকে অন্যান্য বিকল্পগুলি আরও ভাল।


4
কেউ কি জানেন যে এটি কেন কাজ করে, এবং যদি প্রাথমিকভাবে বিষয়টিকে ঘোষিত করার ক্ষেত্রে এটির কোনও সম্ভাব্য বিড়ম্বনা বা সুবিধা থাকে :any?
mcheah

এটি টাইপ করে রাখার স্পষ্ট সুবিধা হবে কারও কাছে কাস্টিং না করে। আমি কেন এটি সতর্কতা ছুঁড়ে না ফেলে তবে সরাসরি অ্যাক্সেস করে তা জানতে চাই
পাউডারহাম

38

এই সমস্যাটি পরিচালনা করার বিভিন্ন উপায় রয়েছে। যদি এই অবজেক্টটি কোনও বাহ্যিক গ্রন্থাগারের সাথে সম্পর্কিত হয় তবে সর্বোত্তম সমাধান হ'ল সেই লাইব্রেরির প্রকৃত সংজ্ঞা ফাইল ( এখানে দুর্দান্ত সংগ্রহস্থল ) সন্ধান করা এবং এটি উল্লেখ করা, উদাহরণস্বরূপ:

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

অবশ্যই, এটি অনেক ক্ষেত্রে প্রযোজ্য নয়।

আপনি যদি টাইপ সিস্টেমটিকে 'ওভাররাইড' করতে চান তবে নিম্নলিখিতগুলি চেষ্টা করুন:

declare var y;

এটি আপনাকে যে কোনও কল করতে চাইবে var y


5
হওয়া উচিত /// <reference path="/path/to/jquery.d.ts" />শেষে স্ব বন্ধের ট্যাগ দিয়ে
মাংসপেশীর আক্ষেপ

আমি ভিএস ২০১৫ ব্যবহার করছি এবং এই টিউটোরিয়ালটি কৌনিক জন্য অনুসরণ করেছি jquery.d.tsআমার প্রকল্পে আমার ফাইল নেই
ডিম্পল

@ ডিম্পল npm install -g tsdতারপরtsd install jquery
আকাশ

আপনি জাভাস্ক্রিপ্ট থেকে টাইপস্ক্রিপ্টে মাইগ্রেশন করছেন এবং দ্বিতীয়বারের জাভা স্ক্রিপ্ট ফাইলটিতে একটি ভেরিয়েবল উল্লেখ করছে কারণ আপনার পুরানো জাভাস্ক্রিপ্টটি পরিবর্তন করতে চাইলে দ্বিতীয় বিকল্পটি (var y ডিক্লেয়ার) দুর্দান্ত কাজ করে T
হ্যাঁমান

ধন্যবাদ! আমার জন্য সমস্যাটি জেস্ট, কনস্ট মকপ্রম্পট নিয়ে ছিল: যে কোনও = jest.spyOn (পদক্ষেপ, 'প্রম্পট');
মার্ক রবসন

18

যখন টাইপসক্রিপ্ট মনে করে যে সম্পত্তি "x" "y" তে নেই , তবে আপনি সর্বদা "y" কে "যে কোনও" তে কাস্ট করতে পারেন, যা আপনাকে "y" তে কোনও কিছু ("x" এর মতো) কল করতে দেয়।

তত্ত্ব

(<any>y).x;

বাস্তব বিশ্বের উদাহরণ

আমি ত্রুটি পেয়ে যাচ্ছিলাম "TS2339: এই কোডটির জন্য" ফাংশন "টাইপ করে সম্পত্তি 'নাম' উপস্থিত নেই:

let name: string = this.constructor.name;

সুতরাং আমি এটি দিয়ে এটি স্থির করেছি:

let name: string = (<any>this).constructor.name;

1
সুপারের সাথে কাজ করে না। আপনি যদি টাইপগুলি ব্যবহার করে কোনও শ্রেণি প্রসারিত করেন এবং লেখক কোনও সার্বজনীন পদ্ধতি ভুলে যান তবে আপনি যথেষ্ট ক্ষতিগ্রস্থ হন। আপনাকে এটিকে টাইপ সংজ্ঞায় যুক্ত করতে হবে, যা পরবর্তী এনপিএল ইনস্টলে বন্ধ হয়ে যায়, আপনাকে একটি পুল অনুরোধ তৈরি করতে বাধ্য করে বা অন্যথায় লেখককে অবহিত করে, যা সম্ভবত একটি ভাল জিনিস তবে ব্যথা।
কোরি অ্যালিক্স

15

অ্যাঙ্গুলার 2 এ সমস্যা ছিল, আমি কিছু সঞ্চয় করতে স্থানীয় সঞ্চয়স্থান ব্যবহার করছিলাম এবং এটি আমাকে ছাড়তে দেবে না।

সলিউশন:

আমার ছিল localStorage.city -> error -> Property 'city' does not exist on type 'Storage'.

কিভাবে ঠিক হবে এটা:

localStorage [ 'শহর']

(LocalStorage) .city

(স্থানীয় হিসাবে কোনও হিসাবে স্টোরেজ) .সিটি


দ্বিতীয় বিকল্পটি দুর্দান্ত দেখায়, তবে কাজটি আর করবে না বলে মনে হয়। যদি আপনি <any>- এর সাথে কোনও বস্তুর উপসর্গ করেন তবে কাজ করে (<any>localStorage).city
জয়য়ারজো

আমি জানি এটি পুরানো তবে আপনার শীর্ষ উদাহরণটি কেবল আমার জন্য কাজ করেছে .. ভাল হয়েছে।
ম্যাকডি

4

একটি দ্রুত স্থিরতা যেখানে অন্য কিছুই কাজ করে না:

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

ভাল অনুশীলন নয় তবে কোনও স্ট্রিং-আক্ষরিক বন্ধ করার প্রয়োজন ছাড়াই একটি সমাধান সরবরাহ করে


আমি এটিও করি তবে কিছু প্ল্যাটফর্ম (গুগল ক্লাউডের মতো) একটি সতর্কতা বার্তা উত্থাপন করবে যা বোঝায় যে আব একটি '' 'বি' এর চেয়ে ভাল। আপনি কেন জানেন কেন?
জোনাথন

1
নিশ্চিত নয় তবে উদাহরণস্বরূপ tslint.json এ আপনি বিকল্পগুলি পরিবর্তন করতে পারেন যাতে এটি পছন্দ করে
danday74

3

আমি জানি এটি এখন ২০২০, কিন্তু আমি এমন কোনও উত্তর দেখতে পেলাম না যা প্রশ্নের "উপেক্ষা" অংশকে সন্তুষ্ট করেছিল। দেখা যাচ্ছে, আপনি টিএসলিন্টকে কেবল এটি নির্দেশনা ব্যবহার করে বলতে পারেন;

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

সাধারণত এটি একটি ত্রুটি ছুঁড়ে মারবে, উল্লেখ করে যে 'টাইপটিতে কিছু প্রোপ বিদ্যমান নেই'। মন্তব্যে, সেই ত্রুটিটি চলে যায়।

এটি সংকলনের সময় কোনও ত্রুটি ফেলে দেওয়া বন্ধ করবে এবং আপনার আইডিই আপনার কাছে অভিযোগ করা বন্ধ করবে।


0

আমার বিশেষ প্রকল্পে আমি এটি কাজ করতে পারি না, এবং ব্যবহার করি declare var $;কোনও পরিষ্কার / প্রস্তাবিত সমাধান নয়, এটি জিকুয়েরি ভেরিয়েবলগুলি চিনতে পারে না, তবে এটি ব্যবহার করার পরে আমার কোনও ত্রুটি ছিল না (এবং আমার স্বয়ংক্রিয় বিল্ডগুলি সফল হতে হয়েছিল)।


0

এই জাতীয় কিছু ব্যবহার করে টাইপস্ক্রিপ্টে আমি এটি পেরেছি:

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 এর ভিতরে মানগুলি Y ম্যাপের জন্য কী এবং সংকলন করতে পারি।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.