সম্পত্তি 'অ্যাসাইন' টাইপ 'অবজেক্ট কনস্ট্রাক্টর' তে বিদ্যমান নেই


130

আমি আমার অ্যাপ্লিকেশনটিতে টাইপস্ক্রিপ্ট ব্যবহার করছি, যেখানে আমি ফাংশন ব্যবহার করি:

Object.assign(this.success, success.json())

তবে সংকলনের সময় আমি নিম্নলিখিত ত্রুটিটি পেয়েছি:

 error TS2339: Property 'assign' does not exist on type 'ObjectConstructor'.

আপনার কী ধারণা আছে যে আমি কীভাবে এই ত্রুটি থেকে মুক্তি পাব?


দয়া করে গৃহীত উত্তরটি পরিবর্তন করে বিবেচনা করুন - এরপরে আরও বেশি উত্তোলনের সাথে আরও ভাল উত্তর পোস্ট করা হয়েছে।
— mindplay.dk

উত্তর:


129

আপনি প্রকারের প্রতিস্থাপন ব্যবহার করতে পারেন , এটির মতো:

(<any>Object).assign(this.success, success.json())

30
বাহ, দুর্দান্ত হ্যাকি মনে হচ্ছে .. আপনি কি ব্যাখ্যা করতে পারবেন (<নতুন> অবজেক্ট) কী করে?
— uksz

ঠিক আছে, আমি দেখতে পাচ্ছি যে আমি ঘোষণা করছি যে অবজেক্টটি কোনও টাইপ করেছে।
— uksz

31
যদিও এটি একটি সমাধান হিসাবে মনে হচ্ছে, এটি সত্যিই এক হিসাবে বিবেচনা করা উচিত নয়। তারপরে কেবল অস্পষ্টতা যুক্ত করুন এবং ট্রান্সপ্লেলার ত্রুটিগুলি আড়াল করুন (যা এটি করে) আসলে এগুলি ঠিক করা এবং কনসোল থেকে দরকারী প্রতিক্রিয়া পাওয়া অনেক বেশি ভাল।
— দিমিত্রি পার্জিৎস্কি

6
এটি কেবল সমস্যাটি কাস্টিং এবং লুকিয়ে রাখছে। আপনাকে নির্দিষ্ট ব্রাউজারগুলিতে পলিফিলগুলি ব্যবহার করতে হবে, ইত্যাদি কিছু ব্রাউজারে ত্রুটিগুলি চলতে দেখা দেবে
— টম ম্যাকার্নে

3
আমি এখানে দেখার জন্য যে কাউকে পরামর্শ দেব কিছুটা আরও নীচে স্ক্রোল করার জন্য যেখানে এটি আপনাকে কী যুক্ত করতে হবে tsconfigযা এটির চেয়ে ভাল সমাধান।
— মেসকিব

175

সজ্জিত করা:

আপনি যদি ভিএস কোড ব্যবহার করছেন (বা আপনি যদি কোনও tsconfig.jsonফাইল দেখতে পান ):

আপনার নিজের libসম্পত্তিটি যুক্ত করা উচিত tsconfig.jsonএবং তারপরে আপনার সম্পাদক বান্ডিল করা টাইপস্ক্রিপ্ট ধরণের সংজ্ঞা ব্যবহার করবেন এবং আপনাকে বুদ্ধিও দেবেন।

শুধু যোগ "lib": ["esnext", "dom"]আপনার টু tsconfig.jsonএবং বনাম কোড পুনরায় চালু

{
    "compilerOptions": {
        // ...
        "target": "es5",
        "lib": ["esnext", "dom"]
        // ...
    }
}

সমস্ত tsconfig.jsonঅপশন এখানে দেখুন ।

আপনি যদি ভিজুয়াল স্টুডিও বা এমএসবিল্ড ব্যবহার করছেন তবে এই ট্যাগটি অন্তর্ভুক্ত করুন:

<TypeScriptLib>esnext, dom</TypeScriptLib>

সমস্ত এমএসবিল্ড টাইপস্ক্রিপ্ট সংকলক বিকল্প এবং ব্যবহার এখানে দেখুন ।


নিজের কাজের খোজ নাও:

যদি আপনি অন্তর্নির্মিত প্রকারগুলি ব্যবহার করতে এবং আপনার সম্পাদক পুনরায় চালু করতে আপনার প্রকল্পটি কনফিগার করেন তবে আপনার ফলাফলটি anyআপনি যখন ব্যবহার করবেন তখন প্রকারের পরিবর্তে এর মতো দেখাবে Object.assign:

কোড উদাহরণ 1


পলিফিল এবং পুরানো ব্রাউজারের সামঞ্জস্যের উপর নোট:

মনে রাখবেন যে আপনি যদি ES5 বা নিম্নে স্থানান্তরিত হয়ে থাকেন এবং IE11 টার্গেট করছেন, আপনাকে পলিফিল অন্তর্ভুক্ত করতে হবে কারণ টাইপস্ক্রিপ্ট সংকলকটি আপনার জন্য পলিফিলগুলি অন্তর্ভুক্ত করবে না।

আপনি যদি পলিফিলগুলি অন্তর্ভুক্ত করতে চান (যা আপনার উচিত) তবে আমি কোর-জেসের পলিফিলগুলি ব্যবহার করার পরামর্শ দেব।

npm install --save core-js

অথবা

yarn add core-js

তারপরে আপনার অ্যাপ্লিকেশানের এন্ট্রি পয়েন্টে (উদাহরণস্বরূপ /src/index.ts) core-jsফাইলের শীর্ষে আমদানি যুক্ত করুন:

import 'core-js';

আপনি যদি কোনও প্যাকেজ ম্যানেজার ব্যবহার না করে থাকেন তবে আপনার এমডিএন থেকে নেওয়া নীচের পলিফিলটি আপনার কোডের এমন কোনও স্থানে পেস্ট করতে পারেন যা আপনার ব্যবহারের আগে চলে Object.assign।

if (typeof Object.assign != 'function') {
  // Must be writable: true, enumerable: false, configurable: true
  Object.defineProperty(Object, "assign", {
    value: function assign(target, varArgs) { // .length of function is 2
      'use strict';
      if (target == null) { // TypeError if undefined or null
        throw new TypeError('Cannot convert undefined or null to object');
      }

      var to = Object(target);

      for (var index = 1; index < arguments.length; index++) {
        var nextSource = arguments[index];

        if (nextSource != null) { // Skip over if undefined or null
          for (var nextKey in nextSource) {
            // Avoid bugs when hasOwnProperty is shadowed
            if (Object.prototype.hasOwnProperty.call(nextSource, nextKey)) {
              to[nextKey] = nextSource[nextKey];
            }
          }
        }
      }
      return to;
    },
    writable: true,
    configurable: true
  });
}

2
আমি "lib" চেষ্টা করেছি: ["es2015", "es2017", "ডোম"] তবে আমি এখনও সম্পত্তি পেয়েছি 'মানগুলি' টাইপ 'অবজেক্ট কনস্ট্রাক্টর' তে নেই। , আমি অনুমান করি এটি অনুমানের মধ্যে নেই
— নিকোস

1
@ নিকোস আপনি কি বনাম কোডটি পুনরায় চালু করেছেন? Object.valuesচশমা হয়। এবং টাইপস্ক্রিপ্ট এর জন্য টাইপ আছে ।
— রিকো কাহলারের

যদি কোনও সুযোগে ওয়েবস্টোরম আপনাকে একটি ত্রুটি দেয় তবে আপনাকে জাভাস্ক্রিপ্ট.নেক্সট প্লাগইনটি এখানে ইনস্টল করতে হবে: প্লাগইনস.জেটব্রেইনস
— নিকোলাস

Tsconfig.json সংশোধন করা আমার পক্ষে কাজ করা একমাত্র কাজ। যেমন যোগ করা"lib": [ "es2015", "es2017", "dom" ]
— ড্যানি সোফটি

2
@ অ্যাকুইর্কি TypeScriptTargetবিকল্পটি এমকাস্ক্রিপ্টের টার্গেট সংস্করণ পরিবর্তন করে (formal আনুষ্ঠানিক জাভাস্ক্রিপ্ট নাম)। এফওয়াইআই: ES2015আইই ১১ এর জন্য উপযুক্ত নয় (যদি আপনাকে এটি সমর্থন করতে হয়)। আপনি এখনও সেট করতে পারেন TypeScriptTargetকরার ES5পাশাপাশি সেটিং TypeScriptLibকরার DOM, ES2015পাশাপাশি IE11 সঙ্গে সামঞ্জস্যপূর্ণ অবশিষ্ট একই ফিক্স অর্জন করা (কিন্তু আপনি যদি ইন্টারনেট সমর্থন করতে হবে না হয় তাহলে, শুধুমাত্র সেট TypeScriptTarget করতে ES2015)।
— রিকো কাহলার

128

আপনি ECMAScript 6 বৈশিষ্ট্যটি ব্যবহার করে এবং ECMAScript 5 বা 3 লক্ষ্যবস্তু করার কারণে এটি ঘটেছে Eas উদাহরণস্বরূপ আপনি গ্রান্ট ব্যবহার করছেন তবে সঠিক লক্ষ্য নির্ধারণ করা সবচেয়ে সহজ সমাধান:

options: {
    target: 'es6'
}

ভিজ্যুয়াল স্টুডিওতে প্রাসঙ্গিক সম্পত্তি ট্যাব পরিবর্তন করতে বা ম্যানুয়ালি আপনার .csproj ফাইল সম্পাদনা করে এবং TypeScriptTarget উপাদানটি সন্ধান করে এবং ES6 এ পরিবর্তন করে উদাহরণস্বরূপ:

<TypeScriptTarget>ES6</TypeScriptTarget>

আপনার যদি ES5 টার্গেট করতে হয় তবে কেবল আপনার টাইপস্ক্রিপ্ট কোডটিতে নিম্নলিখিতটি যুক্ত করুন

declare interface ObjectConstructor {
    assign(target: any, ...sources: any[]): any;
}

এটি অতিরিক্ত পদ্ধতির সাথে একত্রিত হয়ে সমস্যাটি সমাধান করছে। আরও বিশদ এখানে । আপনার ব্রাউজারের সামঞ্জস্যতার প্রয়োজনীয়তার উপর নির্ভর করে আপনার পলিফিলের প্রয়োজন হতে পারে - উদাহরণস্বরূপ MDN থেকে এটি :

if (typeof Object.assign != 'function') {
  (function () {
    Object.assign = function (target) {
      'use strict';
      if (target === undefined || target === null) {
        throw new TypeError('Cannot convert undefined or null to object');
      }

      var output = Object(target);
      for (var index = 1; index < arguments.length; index++) {
        var source = arguments[index];
        if (source !== undefined && source !== null) {
          for (var nextKey in source) {
            if (source.hasOwnProperty(nextKey)) {
              output[nextKey] = source[nextKey];
            }
          }
        }
      }
      return output;
    };
  })();
}

5
@ জোকিইন এই উত্তরটি টিএস ২.০+ এর মতো সমস্যাটিকে সর্বোত্তম উপায়ে সমাধান করে না। আপনি যদি ES5 টার্গেট করছেন তবে আপনার --lib es2015সংকলক বিকল্পটি ব্যবহার করা উচিত । উপরে পদ্ধতির সঙ্গে আমার বিষয় যে আপনি যদি এর পরিবর্তে ব্যবহার করার ফাংশন বিল্ট-ইন ঘোষণা তারপর আপনি সঠিক টাইপিং এবং ডকুমেন্টেশন পাবেন না। তারা বিকল্পটি যুক্ত করেছে যাতে আপনার ইতিমধ্যে স্ট্যান্ডার্ডের অংশ থাকা ইন্টারফেসগুলি পুনরায় ঘোষণা করতে হবে না। declareObject.assign--lib
— রিকো কাহেলার

এটি কাজ করার জন্য আমাকে টাইপস্ক্রিপ্ট ( .d.ts) ফাইলের পরিবর্তে টাইপস ( ) ফাইলে ইন্টারফেসের ঘোষণার যোগ করতে হয়েছিল .ts।
— মাইক চেম্বারলাইন

@ ইউকস সম্ভবত সম্ভবত এটি হ্যাকি নয়, এটি গ্রহণ করা উচিত?
— জেসন

আমি পরিবর্তন "target": "es5",করতে "target": "es6",মধ্যে tsconfig.json। এবং এটি (y)
— থাইপাচে 64 ই

1
কারণ Object.valuesএটি অবশ্যই হওয়া উচিত "target": "es2017", যেহেতু একই ত্রুটি কোডের জন্য এটি শীর্ষ অনুসন্ধান ফলাফল।
— NobleUplift


1

আমি টাইপগুলি যুক্ত করেছি:

typings install dt~es6-shim --global --save

1
একই টাইপের মতো দেখে মনে হচ্ছে আমি কী জবাব দিয়েছি? নাকি আমি কিছু মিস করছি?
— সার্জেজ


-1

আমি জানি এটি দীর্ঘ হয়েছে তবে এখানে একটি সহজ ফিক্স

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