함수 매개 변수의 유형을 설정하시겠습니까?
javascript 함수에 특정 파라미터가 특정 타입임을 알릴 수 있는 방법이 있습니까?
다음과 같은 작업을 수행할 수 있다면 완벽할 것입니다.
function myFunction(Date myDate, String myString)
{
//do stuff
}
감사해요!
업데이트: 답변이 '아니오'라는 것을 알고 싶다면myDate
날짜로 취급하려면(이 함수에 날짜 함수를 호출하려면), 함수 내에서 날짜로 캐스팅하거나 날짜 유형의 변수를 새로 설정해야 합니까?
아니요, JavaScript는 정적으로 입력된 언어가 아닙니다.기능 본문에서 파라미터 유형을 수동으로 확인해야 하는 경우가 있습니다.
javascript 자체 버전이 아니라 Google Closure 컴파일러의 고급 모드를 사용하여 다음을 수행할 수 있습니다.
/**
* @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 를 참조해 주세요.
JavaScript에 유형에 대해 알릴 수는 없지만 IDE에 유형에 대해 알릴 수 있으므로 훨씬 더 유용한 자동 완성을 얻을 수 있습니다.
이를 위한 두 가지 방법은 다음과 같습니다.
JavaScript 코드를 코멘트로 문서화하는 시스템인 JSDoc을 사용합니다.특히 다음과 같은 지시가 필요합니다.
/** * @param {Date} myDate - The date * @param {string} myString - The string */ function myFunction(myDate, myString) { // ... }
JSDoc을 사용하여 커스텀유형을 정의하고 이를 지정할 수도 있습니다.
@param
그러나 JSDoc은 문서 도구일 뿐 유형 확인을 수행하지 않습니다.JSDoc에서 정의된 유형을 확인하려면 JSDoc 태그를 구문 분석할 수 있는 TypeScript를 조사합니다.의 바로 합니다.
/* comment */
:이것은 React에 의해 사용되는 꽤 광범위한 기술입니다.예를 들어 JS입니다.서드파티 라이브러리에 전달되는 콜백 파라미터에 매우 편리합니다.
타입 스크립트
실제 타입 체크에서는 (대부분) JavaScript의 슈퍼셋인 TypeScript를 사용하는 것이 가장 가까운 해결책입니다.5분 후에 Type Script가 나옵니다.
Facebook에서 새로운 Flow 라이브러리를 확인하십시오. "JavaScript 프로그램에서 유형 오류를 찾기 위해 설계된 정적 유형 검사기"
정의:
/* @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
편집: 7년이 지난 지금도 이 답변은 가끔 상향투표를 받습니다.런타임 체크를 원하신다면 괜찮습니다만, 이번에는 Typescript 또는 Flow를 사용하여 컴파일 타임 타입 체크를 권장합니다.상세한 것에 대하여는, 상기의 https://stackoverflow.com/a/31420719/610585 를 참조해 주세요.
원답:
언어에는 포함되어 있지 않지만, 스스로도 쉽게 할 수 있습니다.Vibhu의 답변은 Javascript의 전형적인 타입 체크 방법이라고 생각합니다.좀 더 일반적인 것을 원하는 경우 다음과 같은 것을 시도해 보십시오. (시작하기 위한 예에 불과합니다.)
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
기능에서 래퍼를 사용하여 유형 검사를 자동으로 처리하는 시스템을 구현할 수 있습니다.
방법을 한 이이 with with with 、 with with 、 with with with with with with with 。
declarative type check system
타입 체크를 관리합니다.이 개념을 자세히 알아보려면 Functped 라이브러리를 확인하십시오.
다음 구현에서는 주요 아이디어를 단순하지만 효과적인 방법으로 설명합니다.
/*
* 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
아니요, 대신 필요에 따라 다음과 같은 작업을 수행해야 합니다.
function myFunction(myDate, myString) {
if(arguments.length > 1 && typeof(Date.parse(myDate)) == "number" && typeof(myString) == "string") {
//Code here
}
}
현재 TypeScript는 최고의 솔루션 중 하나입니다.
TypeScript는 언어에 유형을 추가하여 JavaScript를 확장합니다.
타이프 스크립트 버전 데모
// type alias
type myDateType = Date;
type myStringType = string;
function myFunction(myDate: myDateType, myString: myStringType) {
// do stuff
console.log(`myDate =`, myDate);
console.log(`myString =`, myString);
}
myFunction(new Date(), 'TypeScript is awesome!');
참조
https://www.typescriptlang.org/
function myFunction ()
{
arguments = __({myDate: Date, myString: String});
// do stuff
};
설명.
원래의 질문에 대한 직접적인 답변인지는 잘 모르겠지만, IDE에 타입을 이해시키는 방법을 찾기 위해 많은 분들이 오셨을 것 같기 때문에, 제가 발견한 것을 공유하겠습니다.
VSCode에 자신의 유형을 이해시키려면 다음과 같이 하십시오.주의해 주세요js
및 " " " 입니다.NodeJS
이치
솔루션
파일 :.d.ts
료 : 예 :index.d.ts
예를 들면, 다음과 같습니다.types/index.d.ts
에 하다이다라는 .view
이을 . 에 추가해 주세요.index.d.ts
:
/**
* Use express res.render function to render view file inside layout file.
*
* @param {string} view The path of the view file, relative to view root dir.
* @param {object} options The options to send to view file for ejs to use when rendering.
* @returns {Express.Response.render} .
*/
view(view: string, options?: object): Express.Response.render;
- 3 - 을 .jsconfig.json
이 파일을 만드는 것만으로도 VSCode가 원하는 유형을 검색할 수 있습니다.
조금 더
어느 정도 사용할 수 .ts
키워드를 지정합니다.가 VSCode를 하는 한ts
이치노
를 들어, 이 「」를 는, 「」입니다.view
함수, change expressj의 응답,index.d.ts
하다
export declare global {
namespace Express {
interface Response {
/**
* Use express res.render function to render view file inside layout file.
*
* @param {string} view The path of the view file, relative to view root dir.
* @param {object} options The options to send to view file for ejs to use when rendering.
* @returns {Express.Response.render} .
*/
view(view: string, options?: object): Express.Response.render;
}
}
}
결과
또는 사용:
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');
}
이런 도우미 기능일 수도 있어요.그러나 이러한 구문을 정기적으로 사용하는 경우 Typescript로 전환해야 합니다.
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
}
나도 이것에 대해 생각해봤어.C 백그라운드에서 다음과 같은 기능을 사용하여 함수 리턴 코드 유형과 파라미터 유형을 시뮬레이션할 수 있습니다.
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;
}
호출 전 번호 함수는 반환된 실제 값의 유형에 관계없이 번호 유형을 반환합니다(type of rc = number, 그러나 값은 NaN인 두 번째 콜에서 알 수 있음).
위의 console.log는 다음과 같습니다.
1st call
typeof rc: number rc: 1
2nd call
Parm 1 not correct type
typeof rc: number rc: NaN
IDE의 도움을 받을 수 있다고 생각합니다만, 아래의 답변이 도움이 될 수 있습니다.
IDE: 제트브레인/골랑
JSDoc을 잘 보여줄 수 있어요.
데모
나의/pkg/encoding/base64.js
/**
* Convert string to the base64 format.
*
* @param str {string} Input string
* @returns {string} some message about return...
* @example
* - btoa(toBinary("☸☹☺☻☼☾☿"))
* - Str2base64("☸☹☺☻☼☾☿")
* @see https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/btoa#unicode_strings
*/
export function Str2base64(str) {
return btoa(toBinary(str))
}
test.discloss를 실행합니다.discloss 。
import * as base64 from "../pkg/encoding/base64"
const filenameB64 = base64.Str2base64("test")
유용한 JSDoc 매뉴얼
- JSDoc 블록태그
- 사용법을 나타내다
@returns
,@param
,@type
...
- 사용법을 나타내다
기타 링크
언급URL : https://stackoverflow.com/questions/8407622/set-type-for-function-parameters
'source' 카테고리의 다른 글
MariaDB가 타임스탬프를 null로 랜덤으로 설정합니다. (0) | 2022.09.05 |
---|---|
소켓 '/var/run/mysqld/mysqld'를 통해 로컬 MySQL 서버에 연결할 수 없습니다.sock' (2 "그런 파일 또는 디렉토리가 없습니다") (0) | 2022.09.05 |
MySQL에서의 경과시간 계산(InnoDb) (0) | 2022.09.04 |
MySQL은 기존 테이블 열 정렬합니다. (0) | 2022.09.04 |
dup2 및 pipe()를 사용하여 명령어 "ls -l | grep ^d | wc " 를 실행합니다. (0) | 2022.09.04 |