ফাংশন পরামিতি জন্য টাইপ সেট?


161

কোনও জাভাস্ক্রিপ্ট ফাংশনকে জানার কোনও উপায় আছে যে একটি নির্দিষ্ট প্যারামিটার একটি নির্দিষ্ট ধরণের?

এরকম কিছু করতে সক্ষম হওয়া উপযুক্ত হবে:

function myFunction(Date myDate, String myString)
{
    //do stuff
}

ধন্যবাদ!

আপডেট : উত্তরটি একটি সুস্পষ্ট "না" হিসাবে থাকায় যদি আমি myDateএকটি তারিখ হিসাবে বিবেচনা করতে চাই (এতে ডেট ফাংশনগুলি কল করার জন্য), তবে আমাকে এটিকে ফাংশনের অভ্যন্তরে একটি তারিখ হিসাবে কাস্ট করতে হবে বা এর নতুন ভেরিয়েবল সেট করতে হবে have এটি তারিখ টাইপ?


1
একটি অন্তর্নির্মিত এবং সাধারণ অর্থে নয়। আপনি নিজেই এটি করতে পারেন, তবে তারপরে আপনি "নির্দিষ্ট ধরণের" কীভাবে সংজ্ঞা দিচ্ছেন তার উপর নির্ভর করে
hugomg

2
জাভাস্ক্রিপ্টে কোনও ক্লাস নেই, তাই Dateকেবল নেই , নেই object
মুক্তি

@ রাদু: এই মজিলা ডেভেলপ করা নেটওয়ার্ক পৃষ্ঠা সম্পর্কে কী ?
dmr

@ ডিএমআর, এটি কোনও শ্রেণি নয়। Dateএকটি ফাংশন। জাভাস্ক্রিপ্ট কীওয়ার্ড সম্পর্কে আরও জানতে স্ট্যাকওভারফ্লো . com/ প্রশ্নগুলি / ১646669698/২ দেখুন new। এছাড়াও, যেহেতু কোনও ক্লাস নেই তাই কোনও ingালাই নেই। আপনি যে ফাংশনগুলি চান তা কেবল কল করতে পারেন। যদি বস্তুটিতে সেগুলি থাকে তবে সেগুলি চলবে, অন্যথায় আপনি একটি ত্রুটি পাবেন।
মুক্তি দিন

2
এটি এমন একটি পুরানো যা তবে কেউই টাইপস্ক্রিপ্ট উল্লেখ করেনি
কিট

উত্তর:


180

না, জাভাস্ক্রিপ্ট কোনও স্ট্যাটিকালি টাইপ করা ভাষা নয়। কখনও কখনও আপনাকে নিজের ফাংশন বডিটিতে ম্যানুয়ালি ধরণের পরামিতিগুলি পরীক্ষা করতে হবে।


180
আশীর্বাদ এবং একটি অভিশাপ।
জেফ্রি সুইনি 22

40
@ জেফ্রেসিউনিয়ে পিএইচপি স্থিতিযুক্ত টাইপ করা হয় না। তবে আপনার পিএইচপি-তে হিন্টিং টাইপ করার বিকল্প রয়েছে। আপনি কি কখনও বড় নোডেজ ব্যাকএন্ড অ্যাপ্লিকেশনটির দিকে নজর রেখেছেন? হ্যাঁ, প্রতিটি ফাংশনে আর্গুমেন্ট রয়েছে এবং প্রতিটি আর্গুমেন্ট কী তা আপনার কোনও ক্লু নেই। আমরা কয়েক হাজার যুক্তি সম্পর্কে কথা বলছি এবং পড়ার সময় আপনাকে পুরো কোডটি পড়তে হবে এবং কলার এবং তার কলারের পুরো কোড ইত্যাদি পড়তে হবে আশীর্বাদ? আপনি অবশ্যই উপহাস করা উচিত।
তোসকান

14
পৃথক্ কেউ কোন বৈশিষ্ট্য প্রকার অনুমতি আশীর্বাদ আমি টাইপ করা বিষয় বাতলান করতে চাইবেন ইঙ্গিত আহ্বান bashing থেকে: typescriptlang.org মূলত EM6 + + টাইপ হিন্টিং হচ্ছে
Toskan

23
@ জেফ্রেসিউনি এটি কোন আশীর্বাদ নয়। এটা ক্যান্সার।
রোবো রোবক

1
@ তোসকান আমি এটি বলব না যে এটি আশীর্বাদ নয়। আমি এখন চার বছর ধরে জাভাস্ক্রিপ্ট ব্যবহার করে আসছি এবং এটি কেবল কয়েকটি ভাষার প্রকৃতি। প্রোগ্রামিং ভাষার সেট করা উচিত স্বাস্থ্যহীন জোরালোভাবে একই ভাবে এটা উচ্চ স্তর নিম্ন স্তরের থেকে পরিসীমা উচিত টাইপ করতে টাইপ করা থেকে পরিসীমা। অতিরিক্তভাবে, জাভাস্ক্রিপ্ট এতে সহায়তা করার জন্য কীওয়ার্ড instanceofএবং typeofকীওয়ার্ড সরবরাহ করে । যদিও এটি আরও কোড গ্রহণ করে, সম্ভবত এটি জাভাস্ক্রিপ্টটিকে এমন কোনও ভাষার জন্য ভাষা হিসাবে বেছে নেওয়ার জন্য যা প্রকারভেদে মূলত নির্ভর করে। বিশাল নোডেজ ব্যাকএন্ড অ্যাপ্লিকেশন হিসাবে? আমি মনে করি এটি সাধারণ জ্ঞান হওয়া উচিত।
মার্ভিন

81

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

/**
 * @param {Date} myDate The date
 * @param {string} myString The string
 */
function myFunction(myDate, myString)
{
    //do stuff
}

Http://code.google.com/closure/compiler/docs/js-for-compiler.html দেখুন


1
এটি Eclipse JavaScript Editor - আউটলাইন ভিউ এবং কোড সমাপ্তির সাথে সক্ষম করে / সক্ষম করে । যদিও foo( /*MyType*/ param )এখানে বর্ণিত হিসাবে কাজ করে: স্ট্যাকওভারফ্লো.com
আন্দ্রেস ডায়েরিচ

আমি বুঝতে পারি যে এই প্রশ্নটি কতটা পুরানো তবে আমি এটি উল্লেখ করতে চেয়েছিলাম যে এটি ইন্টেলিজিতে সম্মানিত। এখানে খুব underated উত্তর।
চ্যাটডিএম

67

আপনি জাভাস্ক্রিপ্ট ভাষা সম্পর্কে টাইপ সম্পর্কে অবহিত করতে পারবেন না , আপনি তাদের সম্পর্কে আপনার আইডিই অবহিত করতে পারেন, যাতে আপনি আরও অনেক বেশি দরকারী স্বতঃপূরণ পেতে পারেন।

এটি করার দুটি উপায় এখানে রয়েছে:

  1. মন্তব্যে জাভাস্ক্রিপ্ট কোড ডকুমেন্ট করার জন্য জেএসডোক ব্যবহার করুন a বিশেষত, আপনার প্রয়োজন @paramনির্দেশিকা :

    /**
     * @param {Date} myDate - The date
     * @param {string} myString - The string
     */
    function myFunction(myDate, myString) {
      // ...
    }

    আপনি কাস্টম প্রকারগুলি সংজ্ঞায়িত করতে এবং @paramনির্দেশাবলীগুলিতে নির্দিষ্ট করতে জেএসডোক ব্যবহার করতে পারেন তবে নোট করুন যে জেএসডোক কোনও প্রকারের চেকিং করবে না; এটি কেবলমাত্র একটি ডকুমেন্টেশন সরঞ্জাম। জেএসডকে সংজ্ঞায়িত প্রকারগুলি পরীক্ষা করতে, টাইপস্ক্রিপ্টটি দেখুন , যা জেএসডোক ট্যাগগুলি পার্স করতে পারে ।

  2. একটিতে প্যারামিটারের ঠিক আগে টাইপ নির্দিষ্ট করে টাইপ হিন্টিং ব্যবহার করুন
    /* comment */:

    ওয়েবস্টোরমে জাভাস্ক্রিপ্ট টাইপের ইঙ্গিত

    এটি একটি দুর্দান্ত বিস্তৃত কৌশল, উদাহরণস্বরূপ রিঅ্যাকটিজেএস দ্বারা ব্যবহৃত । তৃতীয় পক্ষের লাইব্রেরিতে কলব্যাকগুলির পরামিতিগুলির জন্য খুব সহজ।

টাইপরাইটারে মুদ্রি

প্রকৃত টাইপ পরীক্ষার জন্য, নিকটতম সমাধানটি টাইপস্ক্রিপ্ট, জাভাস্ক্রিপ্টের একটি ( বেশিরভাগ ) সুপারসেট ব্যবহার করা। এখানে 5 মিনিটের মধ্যে টাইপস্ক্রিপ্ট


8
এটি কিভাবে পাবেন VSCode?
আনন্দ উন্ডাভিয়া

2
ধন্যবাদ। যদিও এটি IDE এর উপর নির্ভর করে। আমি ষষ্ঠ ব্যবহার করি এবং কাজ করি না।
negrotico19

@ নেগ্রোটিকো 19: viএকটি অতিরিক্ত ব্যবহার করা সম্পাদক, কোনও আইডিই নয়। আপনি viযেমন এক্সেলে সঙ্গীত ভিডিও তৈরি করতে পারেন তেমন আপনি প্রচুর স্টাফ করতে পারেন । ভাল ধারণা? সম্ভবত না. কাজের জন্য সঠিক টুল ব্যবহার করুন।
ড্যান ড্যাসক্লেস্কু

23

ফেসবুক থেকে নতুন ফ্লো গ্রন্থাগারটি দেখুন, "একটি স্ট্যাটিক টাইপ চেকার, জাভাস্ক্রিপ্ট প্রোগ্রামগুলিতে টাইপ ত্রুটিগুলি সন্ধান করার জন্য ডিজাইন করা হয়েছে"

সংজ্ঞা:

/* @flow */
function foo(x: string, y: number): string {
  return x.length * y;
}
foo('Hello', 42);

টাইপ চেকিং:

$> flow
hello.js:3:10,21: number
This type is incompatible with
  hello.js:2:37,42: string

এবং এটি এখানে এটি চালানো হয়


এক্স তারিখের টাইপ হলে টাইপ সংজ্ঞা কীভাবে যুক্ত করবেন? যেমন foo (x: তারিখ): স্ট্রিং {}} এটি কি এটি সঠিক উপায়?
আকাশ সিগডেল

12

না, পরিবর্তে আপনার প্রয়োজনের উপর নির্ভর করে আপনার এমন কিছু করা দরকার:

function myFunction(myDate, myString) {
  if(arguments.length > 1 && typeof(Date.parse(myDate)) == "number" && typeof(myString) == "string") {
    //Code here
  }
}

12

আপনি এমন কোনও ব্যবস্থা প্রয়োগ করতে পারেন যা আপনার ফাংশনে একটি র‍্যাপার ব্যবহার করে স্বয়ংক্রিয়ভাবে চেকগুলি পরিচালনা করে

এই পদ্ধতির সাহায্যে আপনি একটি সম্পূর্ণ তৈরি করতে পারেন declarative type check systemযা আপনার জন্য টাইপ চেকগুলি পরিচালনা করে। আপনি যদি এই ধারণাটি আরও গভীরভাবে দেখার আগ্রহী হন তবে ফান্টটাইপ লাইব্রেরিটি দেখুন

নিম্নলিখিত বাস্তবায়ন প্রকাশ মূল ধারণা, একটি সরল, কিন্তু অপারেটিভ উপায় :

/*
 * checkType() : Test the type of the value. If succeds return true, 
 * if fails, throw an Error
 */
function checkType(value,type, i){
  // perform the appropiate test to the passed 
  // value according to the provided type
  switch(type){
    case Boolean : 
      if(typeof value === 'boolean') return true;
      break;
    case String : 
      if(typeof value === 'string') return true;
      break;
    case Number : 
      if(typeof value === 'number') return true;
      break;
    default :
      throw new Error(`TypeError : Unknown type provided in argument ${i+1}`);
  }
  // test didn't succeed , throw error
  throw new Error(`TypeError : Expecting a ${type.name} in argument ${i+1}`);
}


/*
 * typedFunction() : Constructor that returns a wrapper
 * to handle each function call, performing automatic 
 * arguments type checking
 */
function typedFunction( parameterTypes, func ){
  // types definitions and function parameters 
  // count must match
  if(parameterTypes.length !== func.length) throw new Error(`Function has ${func.length} arguments, but type definition has ${parameterTypes.length}`);
  // return the wrapper...
  return function(...args){
    // provided arguments count must match types
    // definitions count
    if(parameterTypes.length !== args.length) throw new Error(`Function expects ${func.length} arguments, instead ${args.length} found.`);
    // iterate each argument value, and perform a
    // type check against it, using the type definitions
    // provided in the construction stage
    for(let i=0; i<args.length;i++) checkType( args[i], parameterTypes[i] , i)
    // if no error has been thrown, type check succeed
    // execute function!
    return func(...args);
  }
}

// Play time! 
// Declare a function that expects 2 Numbers
let myFunc = typedFunction( [ Number, Number ],  (a,b)=>{
  return a+b;
});

// call the function, with an invalid second argument
myFunc(123, '456')
// ERROR! Uncaught Error: TypeError : Expecting a Number in argument 2


11

সম্পাদনা করুন: সাত বছর পরে, এই উত্তরটি এখনও মাঝে মাঝে উপবিষ্ট হয়। আপনি রানটাইম চেক করতে চাইলে এটি ঠিক আছে তবে আমি এখন টাইপস্ক্রিপ্ট বা সম্ভবত ফ্লো ব্যবহার করে সংকলন-টাইম টাইপ চেক করার পরামর্শ দেব। আরও জানতে https://stackoverflow.com/a/31420719/610585 দেখুন।

আসল উত্তর:

এটি ভাষার অন্তর্নির্মিত নয়, তবে আপনি নিজেই এটি খুব সহজেই করতে পারেন। বিভুর উত্তরটি আমি জাভাস্ক্রিপ্টে টাইপ চেকিংয়ের সাধারণ উপায়টি বিবেচনা করব। আপনি যদি আরও কিছু সাধারণীকরণ করতে চান তবে এর মতো কিছু ব্যবহার করে দেখুন: (আপনাকে শুরু করার জন্য কেবল উদাহরণ)

typedFunction = function(paramsList, f){
    //optionally, ensure that typedFunction is being called properly  -- here's a start:
    if (!(paramsList instanceof Array)) throw Error('invalid argument: paramsList must be an array');

    //the type-checked function
    return function(){
        for(var i=0,p,arg;p=paramsList[i],arg=arguments[i],i<paramsList.length; i++){
            if (typeof p === 'string'){
                if (typeof arg !== p) throw new Error('expected type ' + p + ', got ' + typeof arg);
            }
            else { //function
                if (!(arg instanceof p)) throw new Error('expected type ' + String(p).replace(/\s*\{.*/, '') + ', got ' + typeof arg);
            }
        }
        //type checking passed; call the function itself
        return f.apply(this, arguments);
    }
}

//usage:
var ds = typedFunction([Date, 'string'], function(d, s){
    console.log(d.toDateString(), s.substr(0));
});

ds('notadate', 'test');
//Error: expected type function Date(), got string
ds();
//Error: expected type function Date(), got undefined
ds(new Date(), 42);
//Error: expected type string, got number
ds(new Date(), 'success');
//Fri Jun 14 2013 success

5

এটি আর্গিলজেএস দিয়ে ইজিলি করা যেতে পারে :

function myFunction ()
{
  arguments = __({myDate: Date, myString: String});
  // do stuff
};

2
দুর্দান্ত লাইব্রেরির মতো দেখাচ্ছে। অভিনন্দন.
এফআরডি

1

ব্যবহার করুন typeofবা instanceof:

const assert = require('assert');

function myFunction(Date myDate, String myString)
{
    assert( typeof(myString) === 'string',  'Error message about incorrect arg type');
    assert( myDate instanceof Date,         'Error message about incorrect arg type');
}

0

সম্ভবত এর মতো কোনও সহায়ক ফাংশন। তবে আপনি যদি নিজেকে নিয়মিত এ জাতীয় সিনট্যাক্সটি নিয়মিত ব্যবহার করতে দেখেন তবে আপনার সম্ভবত টাইপস্ক্রিপ্টে স্যুইচ করা উচিত।

function check(caller_args, ...types) {
    if(!types.every((type, index) => {
        if(typeof type === 'string')
            return typeof caller_args[index] === type
        return caller_args[index] instanceof type;
    })) throw Error("Illegal argument given");
}

function abc(name, id, bla) {
   check(arguments, "string", "number", MyClass)
   // code
}

0

আমি এই সম্পর্কেও ভাবছিলাম। সি ব্যাকগ্রাউন্ড থেকে আপনি নীচের মতো কিছু ব্যবহার করে ফাংশন রিটার্ন কোড প্রকারের পাশাপাশি প্যারামিটারের ধরণগুলি সিমুলেট করতে পারেন:

function top_function() {
    var rc;
    console.log("1st call");
    rc = Number(test_function("number", 1, "string", "my string"));
    console.log("typeof rc: " + typeof rc + "   rc: " + rc);
    console.log("2nd call");
    rc = Number(test_function("number", "a", "string", "my string"));
    console.log("typeof rc: " + typeof rc + "   rc: " + rc);
}
function test_function(parm_type_1, parm_val_1, parm_type_2, parm_val_2) {
    if (typeof parm_val_1 !== parm_type_1) console.log("Parm 1 not correct type");
    if (typeof parm_val_2 !== parm_type_2) console.log("Parm 2 not correct type");
    return parm_val_1;
}

কলিং ফাংশনটির পূর্বে নম্বরটি আসল মানের ধরণটি নির্বিশেষে কোনও নম্বর প্রকার ফেরত দেয়, যেমন দ্বিতীয় কলটিতে দেখা যায় যেখানে টাইপফ আরসি = নম্বর তবে মানটি এনএন

উপরের জন্য কনসোল.লগটি হ'ল:

1st call
typeof rc: number   rc: 1
2nd call
Parm 1 not correct type
typeof rc: number   rc: NaN

0

টাইপস্ক্রিপ্ট আপাতত সেরা সমাধানগুলির মধ্যে একটি

টাইপস্ক্রিপ্ট ভাষাতে প্রকার যোগ করে জাভাস্ক্রিপ্ট প্রসারিত করে।

https://www.typescriptlang.org/

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