Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Deep Dive Into TypeScript

Deep Dive Into TypeScript

HTML5Conference 2017 Room A
Deep Dive Into TypeScriptの発表資料です。

Transcript

  1. None
  2. せ⵸: @brn (ꫬꅿ⨳ⵃ) 耵噟: ؿٗٝزؒٝسؒٝآص،٥ط؎ذ؍ـؒٝآص، ⠓爡: Cyberagent ،سذؙأةآؔRightSegment٥AI Messenger ـؚٗ:

    http://abcdef.gets.b6n.ch/ Twitter: https://twitter.com/brn227 GitHub: https://github.com/brn
  3. Agenda  -  What is TypeScript? TypeScriptך稱➜ -  About TypeSystems

    TypeScriptך㘗חאְג -  About LanguageService TypeScriptךIDE؟ه٦زחאְג -  About CustomTransformer TypeScriptךAST乼⡲חאְג -  Roadmap ➙䖓ךٗ٦سوحفחאְג -  Popular Issues 鑧겗ךIssueחאְג
  4. What is TypeScript? TypeScript׏ג⡦זךׁ

  5. In a word. ְ׻ײ׷AltJSך♧珏կ javascriptח㘗ءأذي׾鷄⸇׃ծEcmascript proposalך堣腉׾ ⯓《׶׃גزٓٝأػ؎ٕׅ׷կ 植㖈TypeScriptכGoogle爡ⰻד׮Ⱅ钠鎉铂ה׃ג䱰欽ׁ׸׷זוծ ׉ך㖑⡘׾然甧׃אא֮׷կ What

    is TypeScript?
  6. Why Type is needed? ז׈㘗ָ䗳銲זך What is TypeScript?

  7. More Robust code 㘗כ؝٦سך侭さ䚍嗚鏾׾〳腉חׅ׷կ ؝ٝػ؎ٕדֹ׷=> ؝٦سח濨湼ָזְկ What is TypeScript?

  8. It's not mean "No Bugs" غָؚזְ׻ֽדכ搀ְկ Runtimeךؒٓ٦כ㢌׻׵׆饯ֹ׷կ What is TypeScript?

  9. But… ׉׸ד׮㘗嗚叨׃ג剑⡚ꣲך嗚鏾כ꫼涸ח׃׋ְ׃ծׅ׷ץֹկ 㘗כ؝٦سח㙵׭鴥ת׸׋剑⡚ꣲךسًُؗٝزד֮׷կ What is TypeScript?

  10. 3rd Party 㢩鿇ךٌآُ٦ٕך㘗כ What is TypeScript?

  11. DefinitelyTyped 3rdParty醡ך㘗㹀纏ؿ؋؎ٕ׾盖椚׃גְ׷GitHub Repoկ npm install @types/… What is TypeScript?

  12. Is DefinitelyTyped Enough? 㘗ך꧊秈٥3rdParty醡ٓ؎ـٓٔפך㘗➰ֽהְֲ䠐㄂דכ㣐ֹ ז䧭卓ה罋ִגְ׷կ 2017/9/14植㖈@types⟃♴חכ3595ך㘗㹀纏ؿ؋؎ָٕ֮׷կ What is TypeScript?

  13. Manual Typing DefinitelyTypedח㘗㹀纏ָזְַծ荈⡲ٓ؎ـٓٔך㜥さכ 荈ⴓד㘗㹀纏׾剅ֻկ What is TypeScript?

  14. import increment from 'increment';! ! increment(1);!

  15. declare module 'increment' {! export default function increment(! a: number!

    ): number;! }!
  16. TypeSystems About Type of TypeScript

  17. ꅾ銲זהֿ׌ֽ

  18. Structural Subtyping 圓鸡涸鿇ⴓ㘗 ؔـآؙؑزך圓鸡ח岣湡׃׋㘗ءأذيկ 㘗ך侭さ䚍כ㘗ך圓鸡ך׫ד嗚鏾ׁ׸׷կ TypeSystems

  19. Why Structural Subtyping? javascriptכ⽯儗ؔـآؙؑز׾⢪ֲ걼䏝ָ넝ְկ ⽯儗ؔـآؙؑزח㼎׃ג㘗ך㹑鎉׾ׅ׷ךכ撕׻׃ְկ TypeSystems

  20. interface Point2D {! x: number;! y: number;! }! ! const

    point = {! x: 0,! y: 0! };! ! function acceptPoint2D(point: Point2D) {}! ! acceptPoint2D(point);!
  21. interface Point2D {! x: number;! y: number;! }! ! const

    point = {! x: 0,! y: 0,! z: 1! };! ! function acceptPoint2D(point: Point2D) {}! ! acceptPoint2D(point);!
  22. Structural Subtyping 㘗ך㹑鎉׾ׅ׷䗳銲כזְկ 圓鸡ָ㘗׾鋉㹀ׅ׷կ TypeSystems

  23. User Defined Type ׮׍׹׿classװinterfaceծenumָ⢪ִ׷կ TypeSystems

  24. interface MyInterface extends OtherInterface,! AnotherInterface {! prop: number;! method(args: string):

    boolean;! optional?: boolean;! }!
  25. class MyClass extends OtherClass implements OtherInterface {! public constructor() {

    super(); }! protected methodFoo() { }! private property: number = 1;! public static methodFoo() { }! private static property = 1;! public get getter() {}! public set setter(value: any) {}! public get set prop() {}! private readonly immutableProp: string = 'a';! }!
  26. enum Enum {! VALUE_A = 1,! VALUE_B, // 2! VALUE_C,

    // 3! }! ! enum Enum {! VALUE_A = 'value'! }! ! Enum.VALUE_A // 'value'! Enum[Enum.VALUE_A] // 'VALUE_A'!
  27. // const修飾するとコンパイル後にリテラル化される const enum ConstEnum {! VALUE = 1,! ...!

    }! const value = ConstEnum.VALUE;! // コンパイル後 => const value = 1;
  28. Type Inference ׮׍׹׿TypeScriptכ㘗䱿锷׮אְג׷կ TypeSystems

  29. // Simple assignment.! const a = 0;! ! // Function

    return value.! const b = () => 1;! ! // Callback! const d = (callback: (a: number) => boolean) => {! callback(1);! };! d(x => x === 0);! ! // Best Common Type.! const p2d = { x: 0, y: 0 };! const p3d = { x: 0, y: 0, z: 1 };! const p4d = { x: 0, y: 0, z: 1, t: 0 }! const c = [ p2d, p3d, p4d ]; // { x: number; y: number }[];!
  30. Generics ְ׻ײ׷筨獥㘗կ 㘗׾ػًٓ٦ة⻉׃㢩鿇ַ׵䭷㹀דֹ׷״ֲחׅ׷կ TypeSystems

  31. // Generic Array! class MyArray<T> {! private arr: T[];! !

    public push(value: T) { this.arr.push(value); }! }! const numArr = new MyArray<number>();! ! // Constraints! function fn<T>(value: T) {! return value.x + 1; // Error!! }! ! function fn<T extends {x: number}>(value: T) {! return value.x + 1;! }!
  32. Type Conversion and Generation 㘗׾ֿיֿיׅ׷կ TypeSystems

  33. // Type Alias! type MyString = string;! ! // Insersection

    Type! type A = { x: number };! type B = { y: number };! type Point2D = A & B;! ! // Union Type! type UnionType = string | number;!
  34. Special Types ׍׳׏ה㢌׻׏׋㘗 TypeSystems

  35. // String Literal Types! type Suit =! 'diamond'! | 'club'!

    | 'spade'! | 'heart';! ! const suit: Suit = 'joker';! // Error !!! ! // Index Type! type StringMap = { [key: string]: string };!
  36. Tagged Union 㘗חةؚ׾אֽ׷կ TypeSystems

  37. // Tagged Union! interface TypeA { kind: 'type-a'; typeAValue: number;

    }! ! interface TypeB { kind: 'type-b'; typeBValue: string; }! ! function processAB(value: TypeA | TypeB) {! switch (value.kind) {! case 'type-a':! return value.typeAValue;! case 'type-b':! return value.typeBValue;! default:! throw new Error('Undefined type.');! }! }!
  38. Type Guard 㘗׾穾׶鴥׬կ TypeSystems

  39. // Type Guard! function fn(! x: Element | number |

    boolean! ) {! if (x instanceof Element) {! console.log(x.tagName);! } else if (typeof x === 'boolean') {! console.log(x);! } else {! console.log(x.toFixed(0));! }! }!
  40. // User defined type guard! function isString(x: any): x is

    string {! return typeof x === 'string';! }!
  41. // Type Guard! function fn(! x: Element | string |

    number | boolean! ) {! if (x instanceof Element) {! console.log(x.tagName);! } else if (typeof x === 'boolean') {! console.log(x);! } else if (isString(x)) {! console.log(x.toUpperCase());! } else {! console.log(x.toFixed(0));! }! }!
  42. never ⵋ麦♶腉կ TypeSystems

  43. function test1(): never {! throw new Error('error');! }! ! function

    test2(value: string | number) {! if (typeof value === 'string') {! ! } else if (typeof value === 'number') {! ! } else {! value // value = never! }! }!
  44. never neverכֲתֻ⢪ִלծ״׶㘗㸜Ⰻז؝٦س׾剅ֻךח⢪ִ׷կ TypeSystems

  45. enum Test { KEY_1 = 1, KEY_2, KEY_3 }! !

    function test(m: Test) {! switch (m) {! case Test.KEY_1:! return 'key1';! case Test.KEY_2:! return 'key2';! default;! const check: never = m;! // error Test.KEY_3 is not assignable to never.! }! }!
  46. Mapped Type 㘗ךفٗػذ؍׾⴨䮙׃ծ㘗׾㢌䳔ׅ׷կ TypeSystems

  47. interface MyInterface {! a: string;! b: number;! c: boolean;! }!

    ! type AKeys = keyof MyInterface;! // AKeys = 'a' | 'b' | 'c'!
  48. type MyInterfaceClone = {! [P in AKeys]: MyInterface[P]! };! //

    MyInterfaceClone = {! // a: string;! // b: number;! // c: boolean;! // }!
  49. type MyPromiseInterface = {! [P in AKeys]: Promise<MyInterface[P]>;! }! //

    MyPromiseInterface = {! // a: Promise<string>;! // b: Promise<number>;! // c: Promise<boolean>;! // }!
  50. Variance ֮׷㘗הⴽך㘗ך湱✼➿Ⰵ〳腉זꟼ⤘䚍 TypeSystems

  51. class Base {! value = 1;! }! ! class Derived

    extends Base {! otherValue = 2;! }! ! class Another extends Base {! anotherValue = 3;! }!
  52. declare let baseArr: Base[];! declare let derivedArr: Derived[];! ! //

    Covariant 共変! baseArr = derivedArr;! ! // Contravariant 反変 Error! // TypeScriptでは認められていない derivedArr = baseArr;!
  53. declare let processDerived: (derived: Derived) => void;! declare let processBase:

    (base: Base) => void;! ! // Bivariant 双変! processDerived = processBase;! processBase = processDerived;! ! // Runtime Error.! processBase(new Another());!
  54. TypeScript Choose… GenericsכⰟ㢌 ꟼ侧כ⿽㢌 TypeSystems

  55. Why Bivariant? ꟼ侧ָBivariantדזְהDerived[] => Base[]ך㢌䳔ָדֹזְկ TypeSystems

  56. class MyArray<T> {! push(value: T);! }! ! declare let arr:

    MyArray<Derived>;! declare let arr2: MyArray<Base>;! arr2 = arr;! // arr = push(value: Derived);! // arr2 = push(value: Base);!
  57. Because be more PRACTICAL. Derived[] => Base[]ך׋׭חBivariantז麣׾鼅׿׌կ ָծ C#ךin/outך״ֲחCovariance/Contravariance׾鼅䫛〳腉חׅ ׷䲿周ָ⳿גְ׷կ

    TypeSystems
  58. Only ONE thing 搀蘠׾ׅ׷ז TypeSystems

  59. Take care of … ثُ٦ؚٔٝ㸣Ⰻ 㘗ٖكٕ TypeSystems

  60. TypeScript is NOT a language like C++ or Scala!! ➬✲ד⢪ֲ儗ך鑧דׅ״…?✮꣇简

  61. Laguage Service TypeScriptךIDE٥ؒر؍ة؟ه٦ز

  62. What is Language Service? غحؙؚٓٝسד⹛⡲ׅ׷IDE؟ه٦ز欽ך؟٦ؽأկ رؿٕؓزדVSCodeָ㼎䘔׃גְ׷կ ؟٦غָ饯⹛ׅ׷׌ֽկ Emacsד׮vimד׮OK! Language Service

  63. LanguageService Plugin TypeScript 2.2ַ׵㼪Ⰵׁ׸׋կ LanguageService׾䭁䓸ׅ׷׋׭ך堣腉 TypeScriptךCompiler劤⡤ח堣腉׾鷄⸇ׅ׷׻ֽדכזְկ LanguageService

  64. Scope -  lint堣腉ך鷄⸇ -  㹑鎉Jump堣腉ך㢌刿 -  string literalװtemplateך圓俑 ثؑحؙ זו

     LanguageService Plugin
  65. 植朐 tsconfig.jsonךpluginsفٗػذ؍ח 鷄⸇ׅ׸ל⢪ִ׷ָծ Angularה Quramyׁ׿ךGraphqlךفؚٓ؎ٝ ֻ׵ְ׃ַזְկ LanguageService Plugin

  66. Custom Transformer TypeScriptךAST乼⡲חאְג

  67. Scope AST׾湫䱸㢌刿׃ג⳿⸂׾㢌刿דֹ׷կ pluginה麩׏ג湫䱸TypeScriptך؝ٝػ؎ٕ穠卓ח➜Ⰵדֹ׷կ TypeScript劤⡤׮ぐ珏Transformerד䕎䧭ׁ׸גְ׷կ Custome Transformer

  68. 植朐 TypeScriptךAST׾ְׄ׸ג㴍׃ְֿהָծ 㘗䞔㜠׾Runtimeח䒷׏䓸׏גֻ׷ֻ׵ְ׃ַזְկ Ⱅ䒭דٗ٦س倯岀ָ欽䠐ׁ׸גְזְկ 儗劍㼿傍זךדכկ Custom Transformer

  69. Next Release 如㔐ٔٔ٦أ✮㹀ך堣腉

  70. Next Release(2017/10) -  ؔ٦ز؝ٝفٔ٦زדimportך酡㸣 -  noImplicitAnyךؒٓ٦׾QuickFixד㘗➰ֽׅ׷ -  Unique-Symbol㘗׾Computed-Propertyה׃גinterface٥type٥ classךًٝغה׃ג⢪ִ׷ - 

    Incremental Compiler APIך䲿⣘ -  @ts-ignore؝ًٝزדJS׮ؒٓ٦׾䫇ⵖ〳腉ח
  71. ؔ٦ز؝ٝفٔ٦زדimportך酡㸣 ٌآُ٦ٕךせ⵸׾ؔ٦ز؝ٝفٔ٦زד酡㸣ׅ׷הծ荈⹛ד import圓俑תד䯏Ⰵ׃גֻ׸׷堣腉կ Next Release(2017/10)

  72. noImplicitAnyךؒٓ٦׾ QuickFixד㘗➰ֽׅ׷ noImplicitAnyָONחז׏גְ׷朐䡾דany㘗׾鋅אֽ׋㜥さծ QuickFixד㘗䞔㜠׾✮䟝׃ג䲿周ׅ׷կ Next Release(2017/10)

  73. Unique-Symbol㘗׾Computed-Property ה׃ג㘗ח⢪ִ׷״ֲח Unique-Symbolהְֲ嚊䙀ָ㼪Ⰵׁ׸׷կ Unique-Symbolהכconstַreadonly⥜귅ׁ׸׋㢌侧٥فٗػ ذ؍կ ֿךUnique-Symbolז㢌侧׾class٥interface٥typeךفٗػ ذ؍ؗ٦ח⢪ֲֿהָדֹ׷կ Next Release(2017/10)

  74. // main.ts (input)! export const x = "literal name";! const

    y = 1;! export interface A {! [x]: string;! [y]: string;! // error: Interface 'A' has or is using private name '[y]' ! // (when using --declaration)! }!
  75. type B {! [x]: string;! [y]: boolean;! }! let a:

    A;! let b: B;! a = b;! // error: Type 'B' is not assignable to type 'A'. ! // Types of property '[y]' are incompatible.!
  76. Incremental Compiler APIך䲿⣘ --watchٌ٦سך鸞䏝何㊣կ ׁ׵חծcreateWatchModeꟼ侧׾䲿⣘✮㹀կ Next Release(2017/10)

  77. @ts-ignore؝ًٝزדJS׮ ؒٓ٦׾䫇ⵖ〳腉ח @ts-ignore؝ًٝز׾鎸鶢ׅ׷ֿהדծ javascriptؿ؋؎ٕ׮暴㹀ךؒٓ٦׾䫇ⵖ〳腉חկ ⟃⵸כTypeScript׃ַ㼎䘔׃גְזַ׏׋կ Next Release(2017/10)

  78. if (false) {! // @ts-ignore: Unreachable code error! console.log("hello");! }!

  79. Roadmap ➙䖓ך㹋鄲ٗ٦سوحف

  80. Plans -  醱侧ךtsconfig.json׾؟ه٦ز -  〳㢌ꞿ㘗ך؟ه٦ز -  ➭ך㘗ءأذيך؟ه٦ز -  㘗ؿ؋؎ٕך㹑鎉ך꧊秈הؒٓ٦ ٔه٦ذ؍ؚٝך何㊣

  81. Plans -  倜׃ְES Decoratorsך㹋鄲 -  Design Time Decorator e.g. deprecated,

    conditional -  Decorators for (arrow) function expression -  dynamic import׾ろ׭׋import㹑 鎉⟃㢩ך倯岀דך㘗䱿锷 -  䕎㹀纏ؿ؋؎ָٕזַ׏׋㜥さחծ @typesךQuickFix׾䲿爙
  82. 醱侧ךtsconfig.json׾؟ه٦ز tsconfig.jsonחdependencyהְֲ갪湡׾⡲׶ծ׉ֿחⴽךفٗ آؙؑزפך⿫撑׾鎸鶢ׅ׷ֿהדծ ⴽךtsconfig.jsonפⳢ椚׾獳隁ׅ׷ֿהָדֹ׷״ֲחז׷կ Roadmap

  83. 〳㢌ꞿ㘗ך؟ه٦ز ְ׻ײ׷Variadic Typeך؟ه٦زկ Genericsך〳㢌ꞿ䒷侧٥Tupleפך㼎䘔ָ〳腉חז׷կ Variadic TypeכTupleה✼䳔䚍׾䭯אկ Roadmap

  84. function makeTuple<...T>(...ts:...T): ...T {! return ts;! }! ! const ts

    = makeTuple('a', 1, {x: 1});! // ...T = [string, number, {x: number}];!
  85. function f<...T,...U>(ts:...T): [...T,...U] {! let us: ...U = makeTuple('hello', 'world');!

    return [...ts, ...us];! }! const ret = f('html', 5, 'conference');! // ret = ['html', 5, 'conference', 'hello', 'world'];! // ...T = [string, number, string]! // ...U = [string, string];! // [...T, ...U] = [string, number, string, string, string]!
  86. Non Structural Subtypingך؟ه٦ز Structural Subtyping⟃㢩Nominal Typing瘝ך㘗ءأذيך 鷄⸇կ ׋׌׃ծוך״ֲח㹋鄲ׅ׷ַךず䠐כה׸גְזְկ Symbol.hasInstance׾⢪ֲ⢽ָ䮙־׵׸גְ׷ָծ׉ך׋׭חכ Symbol.hasInstanceח״׷TypeGuard׮㹋鄲ׅ׷䗳銲ָ֮׷կ

    Roadmap
  87. interface MyNumber extends number {}! ! const Positive = {!

    [Symbol.hasInstance](v) {! return typeof v === 'number' && v > 0;! }! }! ! let value = 1;! if (value instanceof Positive) {! // value is Positive;! }!
  88. 㘗ؿ؋؎ٕך㹑鎉ך꧊秈ה ؒٓ٦ٔه٦ذ؍ؚٝך何㊣ 植㖈ծmodule/declaration/outךאך؝ٝػ؎ٕؔفءّٝ׾ 䭷㹀ׅ׷הծ♧אחתהת׏׋d.tsָ欰䧭ׁ׸׷ָծ ׉ך⚥魦ָぐؿ؋؎ַٕ׵ךؙؒأه٦زחז׏גְ׷ך׾ծ 1ٌآُ٦ٕחתה׭ծexport * as …ׁ׸גְ׷ٌآُ٦ٕせָ עאַ׏׋㜥さחؒٓ٦הׅ׷何⥜周կ

    ׋׌植朐⨡忔׃גֶ׶㼪Ⰵׁ׸׷ַכ♶僇կ Roadmap
  89. declare module "mylib/a" {! export * from "mylib/b";! export *

    from "mylib/c";! }! declare module "mylib/b" {! export interface Foo {}! ! export class Bar {! constructor()! do(): Foo! }! }! declare module "mylib/c" {! export class Baz {}! }! declare module "mylib" {! export * from "mylib/a";! }!
  90. declare module "mylib" {! export interface Foo {}! ! export

    class Bar {! constructor()! do(): Foo! }! ! export class Baz {}! }!
  91. 倜׃ְES Decoratorך㹋鄲 TypeScript2.5儗挿ד㹋鄲ׁ׸גְ׷decoratorכ〢ְproposal׾ ك٦أח׃גֶ׶ծ植儗挿דך倜׋זproposalחさ׻ׇ׷何⥜周կ Roadmap

  92. type Constructor = new(...args): {};! ! interface MemberDesciptor {! kind:

    "Property"! key: string,! isStatic: boolean,! descriptor: PropertyDescriptor,! extras?: MemberDescriptor[]! finisher?(ctor: Constructor): void;! }!
  93. function classDecorator(! ctor: Constructor,! parent: Constructor,! arrayOfDescriptor: MemberDesciptor[]) {! ...!

    }! ! function memberDecorator(! memberDescriptor: MemberDesciptor! ) {! ...! }!
  94. Design Time Decorator ؝ٝػ؎ٕ儗٥Ambient㹑鎉ⰻד鐰⣣ׁ׸׷decorator㹋鄲կ deprecatedװconditional瘝կ ת׌陽锷⚥ך׋׭ծוך״ֲז䕎ח滠㖑ׅ׷ַכ♶僇կ CustomTransformerָדֹ׋ךדծ陽锷ָ♴抟חז׏ג׷䠬׮֮ ׷կ Roadmap

  95. interface JQuery { ! @@deprecated("...", false) ! selector: string; !

    }! ! @@suppressWarning("disallow-leading- underscore") ! function __init() { ! }!
  96. Decorators for (arrow) function expression ꟼ侧䒭ח㼎׃גdecorator׾剅ֽ׷״ֲחׅ׷周կ 劤㹺tc39/proposal-decoratorד׮⡦䏝׮♳ָ׏גְ׷㉏겗׌ָծ ת׌穠锷ָ⳿גְזְկ ꟼ侧㹑鎉דכזֻꟼ侧䒭ח׃ַ黝欽דֹזְךכծ Function

    Hoistingָdecoratorהꟼ侧ח㼎׃ג湱✼⡲欽׃ג㉏겗 ׾䒷ֹ饯ֿׅ׋׭կ Roadmap
  97. dynamic import׾ろ׭׋ import㹑鎉⟃㢩ך倯岀דך㘗䱿锷 dynamic importװ׉ך➭ךimport倯岀דٌآُ٦ٕ׾ٗ٦س׃׋ 㜥さךmoduleך《׶䪔ְ׾何㊣ׅ׷周կ 植㖈ךהֿ׹module㘗׾㼪Ⰵׅ׷倯ぢד鑧ָ鹌׿דְ׷ָծ ㉏겗׮㢳ֻת׌寸㹀涸ז陽锷כ搀ְկ Roadmap

  98. // 0.ts! export interface foo {}! export class C {}!

    // 1.ts! var p: module("./0");! // ここで型と値両方をimportするのか、 // 型は別でimportするのかとかの問題もある。
  99. 䕎㹀纏ؿ؋؎ָٕזַ׏׋㜥さחծ @typesךQuickFix׾䲿爙 ׮׃TypeScript؝ٝػ؎ٓ٦ָ㘗㹀纏׾鋅אֽ׵׸זַ׏׋㜥さ ח@typesַ׵installׅ׷״ֲח䲿周ׅ׷何⥜կ Roadmap

  100. Popular Issues 陽锷ך㽴ֹזְծ㣐➂孡זissue麦

  101. Support override keyword on class methods 倜׋חoverrideؗ٦ٙ٦س׾㼪Ⰵ׃גծ 崢欰ؙٓأדًاحس׾ؔ٦غ٦ٓ؎سׅ׷儗ח鎸鶢ׇׁ׷䲿周կ ♧傉鷿⚥דꟗׄ׵׸גֶ׶ծreopenך䥪격ד㣐ꆀך؝ًٝزָא ְגְג鷄ֲךָ㣐㢌זissueחז׏גְ׷կ

    㹋鄲ׅ׷ֿהכ寸ת׏גְגծׅדח㹋鄲׮㨣ת׏גְ׷կ Popular Issues
  102. Request: Class Decorator Mutation class decoratorָclassך㘗׾㢌刿דֹזְ׋׭ծ decoratorⰻד鷄⸇׃׋فٗػذ؍ח،ؙإأדֹזְկ ׉ך׋׭ծdecoratorדclassך㘗׾㢌刿׃׋ְהְֲissueկ MetaProgramming崢הDecorator should

    not change classז➂ ׋׍ך䨌ְָ粸׶䎢־׵׸גְ׷կ 儗䫓react-reduxךconnectָreference׃ג圫㶨׾鋅גְ׷կ Popular Issues
  103. Suggestion: minification TypeScript؝ٝػ؎ٓדا٦أךMinifyתדװ׷ץֹהְֲ䲿周կ Uglify׾⢪ִהְֲ䠐鋅ָד׷׮ծTypeScriptך㘗䞔㜠׾ְַ׃ ׋剑黝⻉׾׃׋ְהְֲ䠐鋅ָדגծClosureCompilerתד岚⿹ ׃ծIssueָ⠼ן׋կ 植㖈陽锷⚥׌ָת׌ת׌㹋植כ黅ְ䠬ׄկ Popular Issues

  104. ׀幠耮֮׶ָהֲ׀ְׂת׃׋կ

  105. ⿫罋 •  https://qiita.com/na-o-ys/items/aa56d678cdf0de2bdd79 •  https://github.com/Microsoft/TypeScript/issues •  https://github.com/Microsoft/TypeScript/wiki •  http://ufcpp.net/study/csharp/sp4_variance.html • 

    https://speakerdeck.com/vvakame/about-typescript-and-language- server-protocol •  https://ja.wikipedia.org/wiki/ %E5%85%B1%E5%A4%89%E6%80%A7%E3%81%A8%E5%8F%8D %E5%A4%89%E6%80%A7_(%E8%A8%88%E7%AE%97%E6%A9%9F %E7%A7%91%E5%AD%A6)