টাইপস্ক্রিপ্টে ইন্টারফেসে কাস্ট অবজেক্ট


94

আমি একটি ইন্টারফেসে এক্সপ্রেস (বডি পার্সার মিডলওয়্যার ব্যবহার করে) এর অনুরোধের বডি থেকে আমার কোডে একটি কাস্ট করার চেষ্টা করছি, তবে এটি ধরণের সুরক্ষা প্রয়োগ করছে না।

এটি আমার ইন্টারফেস:

export interface IToDoDto {
  description: string;
  status: boolean;
};

এই কোডটি যেখানে আমি castালাই করার চেষ্টা করছি:

@Post()
addToDo(@Response() res, @Request() req) {
  const toDo: IToDoDto = <IToDoDto> req.body; // <<< cast here
  this.toDoService.addToDo(toDo);
  return res.status(HttpStatus.CREATED).end();
}

এবং পরিশেষে, পরিষেবা পদ্ধতি যা বলা হচ্ছে:

public addToDo(toDo: IToDoDto): void {
  toDo.id = this.idCounter;
  this.todos.push(toDo);
  this.idCounter++;
}

ইন্টারফেস সংজ্ঞা মেলে না এমন এমনকি যুক্তিগুলি আমি পাস করতে পারি এবং এই কোডটি ঠিকঠাকভাবে কাজ করবে। আমি প্রত্যাশা করব, রেসপন্স বডি থেকে ইন্টারফেসে castালাই যদি সম্ভব না হয় তবে জাভা বা সি # এর মতো রানটাইমের সময় একটি ব্যতিক্রম ছুঁড়ে ফেলা হবে।

আমি পড়েছি যে টাইপস্ক্রিপ্টে কাস্টিংয়ের অস্তিত্ব নেই, কেবলমাত্র এসেসারেশন টাইপ করুন, সুতরাং এটি কেবলমাত্র সংকলককে বলবে যে কোনও বস্তু টাইপযুক্ত x, তাই ... আমি কি ভুল করছি? প্রকার সুরক্ষা প্রয়োগ এবং তা নিশ্চিত করার সঠিক উপায় কী?


4
দয়া করে "এটি কাজ করছে না" সংজ্ঞা দিন। নিখুঁত হউন. কোন ত্রুটি আছে? কোনটি? সংকলন-সময়ে? রানটাইম এ? কি ঘটেছে?
জেবি নিজত

4
রানটাইমের সময়, কোডটি যা কার্যকর হয় তা দিয়েই আমি সম্পাদন করি।
ইলিয়াস গার্সিয়া

আপনি কী জিজ্ঞাসা করছেন তা স্পষ্ট নয়
নিতজান টোমর

আমার প্রশ্ন হ'ল কীভাবে টাইপ করা অবজেক্টে আগত অবজেক্টটি কাস্ট করা যায়। যদি কাস্ট সম্ভব না হয় তবে জাভা, সি এর মতো রানটাইমের সময় একটি ব্যতিক্রম ছুঁড়ে দিন ...
এলিয়াস গার্সিয়া

উত্তর:


133

জাভাস্ক্রিপ্টে কোনও ingালাই নেই, সুতরাং "কাস্টিং ব্যর্থ হলে" আপনি ফেলে দিতে পারবেন না।
টাইপস্ক্রিপ্ট কাস্টিংকে সমর্থন করে তবে এটি কেবল সংকলনের সময়ের জন্য, এবং আপনি এটি এর মতো করতে পারেন:

const toDo = <IToDoDto> req.body;
// or
const toDo = req.body as IToDoDto;

মানটি বৈধ কিনা আপনি রানটাইম পরীক্ষা করতে পারেন এবং যদি ত্রুটি না ফেলে থাকেন তবে:

function isToDoDto(obj: any): obj is IToDoDto {
    return typeof obj.description === "string" && typeof obj.status === "boolean";
}

@Post()
addToDo(@Response() res, @Request() req) {
    if (!isToDoDto(req.body)) {
        throw new Error("invalid request");
    }

    const toDo = req.body as IToDoDto;
    this.toDoService.addToDo(toDo);
    return res.status(HttpStatus.CREATED).end();
}

সম্পাদনা করুন

@ হুইজ যেমন উল্লেখ করেছেন, প্রকারের প্রতিবেদনের দরকার নেই কারণ isToDoDtoএক প্রকার প্রহরী, সুতরাং এটি যথেষ্ট হওয়া উচিত:

if (!isToDoDto(req.body)) {
    throw new Error("invalid request");
}

this.toDoService.addToDo(req.body);

const toDo = req.body as IToDoDto;টিএস সংকলক জানেন যে এটি IToDoDtoএই মুহুর্তে এটি হ'ল
হাইজ

9
যে কেউ সাধারণভাবে প্রার্থনা টাইপ খুঁজছেন তার জন্য <> ব্যবহার করবেন না। এটি হ্রাস করা হয়। ব্যবহারas
অভিষেক দেব

" জাভাস্ক্রিপ্টে কোনও ingালাই নেই, সুতরাং" কাস্টিং ব্যর্থ "হলে আপনি ফেলে দিতে পারবেন না" "আমার কাছে মনে হয়, টাইপস্ক্রিপ্টের ইন্টারফেসগুলি কার্যকর নয়; আসলে, তারা 100% সিনট্যাটিক চিনি । তারা সহজে কাঠামো বজায় রাখার জন্য করা ধারণার দিক থেকে , কিন্তু transpiled কোডের উপর কোন প্রকৃত প্রভাব - যা হয়, নিচ, ঝটপটভাবে বিভ্রান্তিকর / বিরোধী প্যাটার্ন, অপ প্রশ্নের প্রমাণ হিসাবে। ইন্টারফেসের সাথে মেলে ব্যর্থ জিনিসগুলি ট্রান্সপ্লেরড জাভাস্ক্রিপ্টে ফেলতে পারে না এমন কোনও কারণ নেই; এটি টাইপস্ক্রিপ্ট দ্বারা সচেতন (এবং দরিদ্র, ইমো) পছন্দ।
রাফিন

@ আরফিন ইন্টারফেসগুলি সিনট্যাকটিক চিনি নয়, তবে কেবলমাত্র রানটাইমে রাখার জন্য তারা সচেতনভাবে পছন্দ করেছেন। আমি মনে করি এটি দুর্দান্ত পছন্দ, রানটাইমের সময় কোনও পারফরম্যান্স পেনাল্টি নেই।
নিতজান টোমার

তোমায়েতো তোমাটো ? টাইপস্ক্রিপ্টে ইন্টারফেস থেকে প্রকারের সুরক্ষা আপনার পরিবহিত কোডে প্রসারিত হয় না, এবং প্রাক-রানটাইম প্রকারের সুরক্ষা মারাত্মকভাবে সীমাবদ্ধ থাকে - যেমনটি আমরা ওপির ইস্যুতে দেখি যেখানে কোনও ধরণের সুরক্ষা নেই । টিএস বলতে পারে, "আরে, অপেক্ষা করুন, আপনার এখনও anyনিশ্চিত হওয়ার নিশ্চয়তা IToDoDtoনেই!", কিন্তু টিএস তা না মানা বেছে নিয়েছিল। যদি সংকলকটি কেবলমাত্র কিছু ধরণের দ্বন্দ্বগুলি সনাক্ত করে এবং পরিবহিত কোডের মধ্যে কোনওটিই নেই (এবং আপনি ঠিক বলেছেন; আমার কাছে আরও বেশি পরিষ্কার হওয়া উচিত @ যে মূলতে), ইন্টারফেসগুলি দুর্ভাগ্যক্রমে, ইমো, [বেশিরভাগ?] চিনির are
রাফিন

7

অসম্পূর্ণ প্রকার এবং ইন্টারফেসের মধ্যেও টাইপ-কাস্ট করতে বাধ্য করার অন্য উপায় এখানে যেখানে টিএস সংকলক সাধারণত অভিযোগ করে:

export function forceCast<T>(input: any): T {

  // ... do runtime checks here

  // @ts-ignore <-- forces TS compiler to compile this as-is
  return input;
}

তারপরে আপনি এটি নির্দিষ্ট ধরণের কাস্ট অবজেক্টগুলিকে জোর করতে ব্যবহার করতে পারেন:

import { forceCast } from './forceCast';

const randomObject: any = {};
const typedObject = forceCast<IToDoDto>(randomObject);

নোট করুন যে জটিলতা হ্রাস করার জন্য আপনি ingালাইয়ের আগে রানটাইম চেক করার কথা ভাবেন সেই অংশটি আমি ছেড়ে দিয়েছি। আমার প্রকল্পে আমি যা করি তা হ'ল আমার সমস্ত .d.tsইন্টারফেস ফাইলগুলি JSON স্কিমায় সংকলন করে ajvরানটাইমটিতে বৈধতা দেওয়ার জন্য ব্যবহার করছে।


1

যদি এটি কাউকে সহায়তা করে তবে আমার একটি সমস্যা ছিল যেখানে আমি কোনও বিষয়টিকে একই ধরণের ইন্টারফেসের সাথে অন্য ধরণের হিসাবে বিবেচনা করতে চাই। আমি নিম্নলিখিত চেষ্টা:

আবরণ পাস করেনি

const x = new Obj(a as b);

লিন্টারে অভিযোগ করা aহয়েছিল যে বিদ্যমান বৈশিষ্ট্যগুলি অনুপস্থিত ছিল b। অন্য কথায়, aকিছু বৈশিষ্ট্য এবং পদ্ধতি ছিল b, কিন্তু সব ছিল না। এটি সম্পর্কে কাজ করার জন্য, আমি ভিএস কোডের পরামর্শ অনুসরণ করেছি:

আবরণ এবং পরীক্ষা উত্তীর্ণ

const x = new Obj(a as unknown as b);

মনে রাখবেন যে যদি আপনার কোড টাইপটিতে bপ্রয়োগ করা হয় না এমন ধরণের একটি বৈশিষ্ট্য কল করতে চেষ্টা করে তবে আপনার aরানটাইম ত্রুটি উপলব্ধি করা উচিত।


4
আমি এই উত্তরটি পেয়েছি বলে আমি আনন্দিত, তবে মনে রাখবেন যে আপনি যদি নেটওয়ার্কের মাধ্যমে বা অন্য কোনও অ্যাপ্লিকেশনটিতে 'x' প্রেরণ করছেন তবে আপনি ব্যক্তিগত তথ্য ফাঁস করে দিতে পারেন (যদি 'a' উদাহরণস্বরূপ ব্যবহারকারী হয়), কারণ 'x' এখনও 'এ' এর সমস্ত বৈশিষ্ট্য রয়েছে, এগুলি টাইপ স্ক্রিপ্টের জন্য কেবল অনুপলব্ধ।
জোল্টন ম্যাটেক

@ জোল্টনম্যাটাক ভালো পয়েন্ট। এছাড়াও, জাভাস্ক্রিপ্ট এবং পদ্ধতিগুলির উপর জাভা শৈলী প্রাপ্তকারী এবং সেটটারদের জন্য একটি যুক্তি আছে নেটওয়ার্কের মাধ্যমে ক্রমিক অবজেক্ট পাঠানোর বিষয়ে regarding getset
জেসন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.