farmeter / random

0 stars 0 forks source link

Typescript의 Javascript 타입검사 #20

Open farmeter opened 4 years ago

farmeter commented 4 years ago

개요

--checkJs를 사용해 .js 파일에서도 Typescript처럼 타입 검사 및 오류 확인이 가능합니다.

JSDoc 타입

.js 파일에서는, 흔히 .ts 파일처럼 타입을 추론해볼 수 있습니다.

$tsc --allowJs --checkJs --outDir dist jsdoc.js

/** @type {number} */
var x;

x = 0;      // 성공
x = false;  // 오류: 불리언(boolean)에는 숫자를 할당할 수 없음

클래스 프로퍼티


class C {
    constructor() {
        this.constructorOnly = 0
        this.constructorUnknown = undefined
    }
    method() {
        this.constructorOnly = false // 오류, constructorOnly는 Number 타입임
        this.constructorUnknown = "plunkbat" // 성공, constructorUnknown의 타입은 string | undefined
        this.methodOnly = 'ok'  // 성공, 그러나 methodOnly는 undefined 타입 또한 허용됨
    }
}
class C {
    constructor() {
        /** @type {number | undefined} */
        this.prop = undefined;
        /** @type {number | undefined} */
        this.count;
    }
}

let c = new C();
c.prop = 0;          // 성공
c.count = "string";  // 오류: string 은 number|undefined에 할당할 수 없음

객체 리터럴

var obj = { a: 1 };
obj.b = 2;  // 허용됨
/** @type {{a: number}} */
var obj = { a: 1 };
obj.b = 2;  // 오류, {a: number}타입엔 b 프로퍼티가 없음

함수 매개변수

function bar(a, b) {
    console.log(a + " " + b);
}

bar(1);       // 성공, 두 번째 인수는 선택 사항임
bar(1, 2);
bar(1, 2, 3); // 오류, 인수의 갯수가 너무 많음

sayHello();


```javascript
/** @param {...number} args */
function sum(/* numbers */) {
    var total = 0
    for (var i = 0; i < arguments.length; i++) {
      total += arguments[i]
    }
    return total
}

지원되는 JSDoc 예제

x.push(1); // 성공 x.push("string"); // 성공, x는 Array 타입임

/* @type{Array.} / var y = [];

y.push(1); // 성공 y.push("string"); // 오류, string을 number 타입에 할당할 수 없음


### `@type`
```javascript
/**
 * @type {(string | boolean)}
 */
var sb;
//유니언 타입에는 괄호가 선택 사항이라는 점에 유의하세요.

/**
 * @type {string | boolean}
 */
var sb;
/** @type {number[]} */
var ns;
/** @type {Array.<number>} */
var nds;
/** @type {Array<number>} */
var nas;
/** @type {{ a: string, b: number }} */
var var9;
/** @type {Function} */
var fn7;
/**
 * @type {*} - 어떠한 타입이든 될 수 있음
 */
var star;
/**
 * @type {?} - 식별되지 않은 타입 ('any'와 같음)
 */
var question;

Type Cast

/**
 * @type {number | string}
 */
var numberOrString = Math.random() < 0.5 ? "hello" : 100;
var typeAssertedNumber = /** @type {number} */ (numberOrString)

@param and @returns

// 매개변수는 다양한 형태의 구문으로 선언될 수 있음
/**
 * @param {string}  p1 - 문자열 매개변수
 * @param {string=} p2 - 선택적 문자열 매개변수
 * @param {string} [p3] - 또다른 선택적 매개변수 (JSDoc 구문)
 * @param {string} [p4="test"] - 기본값을 가진 선택적 매개변수
 * @return {string} 결과
 */
function stringsStringStrings(p1, p2, p3, p4){
  // TODO
}

@template

@template 를 통해 제네릭 타입을 선언할 수 있습니다.

/**
 * @template T
 * @param {T} x - 리턴 타입까지 사용되는 제네릭 매개변수
 * @return {T}
 */
function id(x){ return x }

요약

  1. .jscheckJs 옵션을 이용하여 타입 검사가 가능합니다.
  2. JSDoc를 이용하여 타입을 지정할 수 있습니다.
  3. 다른 이유가 없다면, .ts를 사용하세요.
farmeter commented 4 years ago

https://www.typescriptlang.org/docs/handbook/type-checking-javascript-files.html