let age: number;
age = '12' as any;
age += 1;
// λ°νμμ μ μ μλ, ageλ "121"
μ μ½λλ₯Ό 보면 age
λ number
νμ
μΌλ‘ μ μΈλμμ§λ§ as any
(νμ
λ¨μΈλ¬Έ)λ₯Ό μ¬μ©νμ¬ string
νμ
μ κ°μ age
λ³μμ ν λΉνλ€.
π any
νμ
μ μ΄μ©νλ©΄ νμ
체컀λ₯Ό 무λ ₯νμμΌ νμ
μμ μ±μ 보μ₯ν μ μκ² λλ€.>
any
νμ
μ λΆμ¬νλ©΄ μλμμ± κΈ°λ₯μ λμμ λ°μ§ λͺ»νλ€.any νμ μ ꡬ체μ μΌλ‘ λ³νν΄μ μ¬μ©νμ
μΌλ°μ μΈ μν©μμλ anyλ³΄λ€ λ ꡬ체μ μΌλ‘ ννν μ μλ νμ μ΄ μ‘΄μ¬ν κ°λ₯μ±μ΄ λκΈ° λλ¬Έμ λ ꡬ체μ μΈ νμ μ μ°Ύμ νμ μμ μ±μ λμ΄λλ‘ ν΄μΌ νλ€.
Example
λ°°μ΄
// **BAD**
function getLength(arr: any) {
return array.length; // any
}
// **GOOD**
function getLength(arr: any[]) {
return array.length; // number
}
array.length
νμ
μ΄ μ²΄ν¬λλ€.any
λμ number
λ‘ μΆλ‘ λλ€.κ°μ²΄
function hasTweleveLetterKey(o: {[key: string]: any}) {
for (const key in o) {
if (key.length == 12) {
console.log(key, o[key]);
return true;
}
}
return false;
}
{[key:string]: any}
λμ λͺ¨λ λΉκΈ°λ³Έν νμ
μ ν¬ν¨νλ object
νμ
μ μ¬μμ μ μλ€. object
νμ
μ κ°μ²΄μ ν€λ₯Ό μ΄κ±°ν μλ μμ§λ§, μμ±μ μ κ·Όν μ μλ€.function hasTweleveLetterKey(o: object) {
for (const key in o) {
if (key.length == 12) {
console.log(key, o[key]); // ERROR
return true;
}
}
return false;
}
ν¨μ
any
λμ μ΅μνμΌλ‘λ§λ νμ
μ ꡬ체νν΄μΌ νλ€.type Fn0 = () => any; // 맀겨λ³μ μμ΄ νΈμΆ κ°λ₯ν λͺ¨λ ν¨μ
type Fn1 = (arg: any) => any; // 맀κ°λ³μ 1κ°
type Fn2 = (...args: any[]) => any; // λͺ¨λ κ°μμ 맀κ°λ³μ - "Function" νμ
κ³Ό λμΌνλ€.
π
any
λ₯Ό μ¬μ©ν λλ μ λ§λ‘ λͺ¨λ κ°μ΄ νμ©λμ΄μΌλ§ νλμ§ λ©΄λ°ν κ²ν ν΄μΌ νλ€.
μμμ any
νμ
μ μ΄λ€ κ°μ ν λΉν λ any
νμ
μ ꡬ체μ μΈ νμ
μΌλ‘ μ§ννλ€. any
κ° μ§νλ°©μμ μΌλ°μ μΈ λ³μκ° μΆλ‘ λλ μ리μ λμΌνλ€.
let val; // any
if (Math.random() < 0.5) {
val = '/hello/'; // RegExp
}
else {
val = 12; // number
}
// val: number | RegExp
λ°°μ΄μ λ€μν νμ μ μμλ₯Ό λ£μΌλ©΄ λ°°μ΄μ νμ μ΄ νμ₯λλ©° μ§νλλ€.
function range(start: number, limit: number){
const out = []; // any[]
for (let i = start; i < limit; i++) {
out.push(i);
}
return out; // number[]
}
any
νμ
μ μ§νλ noImplicitAny
κ° μ€μ λ μνμμ λ³μμ νμ
μ΄ μμμ any
μΈ κ²½μ°μλ§ μΌμ΄λλ€. λͺ
μμ μΌλ‘ any
λ₯Ό μ μΈνλ©΄ νμ
μ΄ κ·Έλλ‘ μ μ§λλ€.
let val: any; // any
if (Math.random() < 0.5) {
val = '/hello/'; // any
}
else {
val = 12; // any
}
// val: any
μμμ any
νμ
μ ν¨μ νΈμΆμ κ±°μ³λ μ§ννμ§ μλλ€.
// **BAD**
function makeSquares(start: number, limit: number) {
const out = []; // any[]
range(start, limit).forEach(i => {
out.push(i*i);
});
return out; // any[]
}
// **GOOD**
function makeSquares(start: number, limit: number) {
const out = range(start, limit).map(i => i*i); // number[]
return out;
}
π μμμ
any
νμ μ κ°μ ν λΉνκ±°λany[]
νμ μ μμλ₯Ό λ£μ΄ νμ μ΄ μ§νν μ μμ§λ§, λͺ μμ νμ ꡬ문μ μ¬μ©νλ κ²μ΄ νμ μμ μ±μ΄ λ λλ€.
곡ν΅μ : μ΄λ€ νμ
μ΄λ any
νΉμ unknown
νμ
μ ν λΉ κ°λ₯νλ€.
const a: any = 1;
const b: unknown = "string";
μ°¨μ΄μ
any
νμ
μ μ΄λ€ νμ
μΌλ‘λ ν λΉμ΄ κ°λ₯νλ° unknown
νμ
μ μ€μ§ unknown
κ³Ό any
νμ
μλ§ ν λΉ κ°λ₯νλ€.const c: number = a;
const d: string = b; // ERROR (Type 'unknown' is not assignable to type 'string'.)
any
νμ
μ μ¬μ©νλ©΄ μ€λ₯κ° λ°μνμ§ μμ§λ§, unknown
νμ
μΈ μ±λ‘ κ°μ μ¬μ©νλ©΄ μ€λ₯κ° λ°μνλ€.// ν¨μ λ°νκ°μ΄ any νμ
interface Book {
name: string;
author: string;
}
function parseYAML(yaml: string): any {
// ...
}
const book = parseYAML(`
name: Jane Eytre
author: Charlotte Bronte
`);
alert(book.title); // μ€λ₯ μμ. λ°νμμ "undefined" μλ¬ λ°μ
book("read"); // μ€λ₯ μμ. λ°νμμ "TypeError" λ°μ
// ν¨μ λ°νκ°μ΄ unknown νμ
function safeParseYAML(yaml: string): unknown {
return parseYAML(yaml);
}
const book = safeParseYAML(`
name: Jane Eytre
author: Charlotte Bronte
`);
alert(book.title); // ERROR: κ°μ²΄κ° unknown νμμ
λλ€.
book("read"); // ERROR: κ°μ²΄κ° unknown νμμ
λλ€.
unknown
νμ
μ κ·Έλλ‘ μ¬μ©ν μ μκΈ° λλ¬Έμ νμ
λ¨μΈλ¬Έμ΄λ μ¬μ©μ μ μ νμ
κ°λ νΉμ instanceof
μ°μ°μλ₯Ό μ΄μ©νμ¬ unknown
νμ
μ μνλ νμ
μΌλ‘ λ³νν΄μΌ νλ€.// νμ
λ¨μΈ
const book = safeParseYAML(`
name: Jane Eytre
author: Charlotte Bronte
`) as Book;
alert(book.title); // ERROR: 'Book' νμμ 'title' μμ±μ΄ μμ΅λλ€.
book("read"); // ERROR: μ΄ μμ νΈμΆν μ μμ΅λλ€.
// μ¬μ©μ μ μ νμ
κ°λ
function isBook(val: unknown): val is Book {
return (
typeof(val) === 'object' && val !== null && 'name' in val && 'authon' in val
);
}
function processValue(val: unknown) {
if (isBook(val)) {
// val: Book
}
}
// instanceof
function processValue(val: unknown) {
if (val instanceof Date) {
// val: Date
}
}
π νμ μ λͺ¨λ₯Ό λλ
any
λμunknown
μ μ¬μ©νμ!
noImplicitAny
λ₯Ό μ€μ νκ³ λͺ¨λ μμμ any
λμ λͺ
μμ νμ
ꡬ문μ μΆκ°ν΄λ any
νμ
κ³Ό κ΄λ ¨λ λ¬Έμ λ€λ‘λΆν° μμ νλ€κ³ ν μ μλ.
any
νμ
@types
)type-coverage ν¨ν€μ§
$ npx type-coverage
9985 / 10117 98.69/5
$ npx type-coverage --detail
path/to/code.ts:1:10 getColumnInfo
path/to/module.ts:7:1 pt2
π
type-coverage
ν¨ν€μ§λ₯Ό μ΄μ©νμany
νμ μ μΆμ ν μ μλ€.