TypeScript의 FileReader를 구하면

15795 단어 TypeScript
TypeScript 2.7에서 FileReader 코드를 사용할 때 유형 정보가 부족할까 봐 Microsoft/TSJS-lib-generator에서 PR #398 제출(45ypeScript 2.9).
사건의 시작은 Type Script 2.7로 작성된 이런 코드였다.
const reader = new FileReader()
reader.onload = (event) => {
  // Property 'result' does not exist on type 'EventTarget'.
  const url = event.target.result
}
reader.readAsFileURL(file)
MDN용 FileReaderonload 위와 같은 간단한 파일로 읽기는 하지만 이걸 쓰면'없다event.target.result'는 소리를 듣는다.
같은 질문Type Script의 issue도 있었기 때문에 입을 다물고 타입 스크립트 자신의 FileReader를 입수하도록 하기로 했다.

어디서 구하다

FileReader.onloadnode_modules/typescript/lib/lib.dom.d.ts에서 이렇게 정의했다.
node_modules/typescript/lib/lib.dom.d.ts
interface FileReader extends EventTarget {
    // ...
    onload: ((this: FileReader, ev: ProgressEvent) => any) | null;
    // ...
}
이것ev은 길다target: EventTarget | null.그것target에서 태어났다면result 썼다event.target.result도 뭐라고 하지 않았을 것이다.인상으로는 이런 형식이었으면 좋겠어요.
interface FileReader extends EventTarget {
    // ...
    onload: ((this: FileReader, ev: FileReaderProgressEvent) => any) | null;
    // ...
}

interface FileReaderProgressEvent extends ProgressEvent {
    result: FileReader | null;
}
이렇게 하려면 타입 스크립트lib.dom.d.ts를 구해야 한다.어떻게 하면 좋을까?
Type Script의 README의 Contribute 항목에서 CONTRIBUTING.md까지의 링크를 붙여 넣습니다.여기 적힌 대로 하면 돼.
lib로 이 자료를 검색하면 곧 Contributing lib.d.ts fixes 항목에 걸릴 것입니다.저기 있다
  • 라이브러리의 원본 파일은 src/lib에 있습니다
  • src/lib/dom.generated.d.ts는 자동으로 생성되기 때문에 변경하고 싶은 경우https://github.com/Microsoft/TSJS-lib-generator에 PR
  • 을 보냅니다.
    위에 쓰여 있다.lib/README.md src/lib/dom.generated.d.ts는 생성lib/lib.dom.d.ts에 사용되는 파일입니다.
    따라서 다시 쓰기lib.dom.d.ts는 다시 쓰기src/lib/dom.generated.d.ts가 필요하고, 다시 쓰기 위해서는 TSJS-lib-generator를 수정해야 한다.응, 길어.

    TSJS-lib-generator란


    TSJS-lib-generator는 창고에서 설명한 대로 DOM과 관련된 Type Script 및 JavaScript 라이브러리 파일을 생성하는 도구입니다.이 Contribution Guidelines에는 해야 할 일이 진지하게 적혀 있다.짧기 때문에 일본어로 번역된 것을 먼저 넣습니다.

    Contribution Guidelines


    TypeScript 창고의 dom.generated.d.ts, webworker.generated.d.ts, dom.iterable.generated.d.ts 파일을 베이스라인으로 사용합니다.초대장마다 스크립트를 실행하고 생성된 파일과 기선의 파일을 비교합니다.테스트를 통과하기 위해 신청 시 기선을 갱신해 주십시오.
    일반적인 변경은 json 파일만 변경하면 됩니다.유형의 생성은 주로 addedTypes.json, overridingTypes.json, removedTyes.json 세 개의 파일을 사용한다.comments.json 파일 유형에 주석을 추가할 수 있습니다.마지막으로knownWorkerTypes.json WebWorker 환경에서 사용할 유형을 결정합니다.
    각 파일의 형식을 컨텐트에서 살펴보십시오.
    초대 요청을 보내는 일반적인 단계는 다음과 같습니다.

  • 제작 여부TypeScript 웨어하우스의 issue
  • 참조
  • inputfiles/addedTypes.json에 부족한 요소를 추가하고inputfiles/overridingTypes.json에서 덮어쓰고inputfiles/removedTypes.json에서 요소를 삭제
  • 로컬에서 구축 스크립트를 실행하여 새 dom.generated.d.tswebworker.generated.d.ts
  • 작성
  • generated 폴더로 출력된 파일baselines을 사용하여 폴더를 업데이트하는 파일npm run baseline-accept
  • 원문은 0단계에서 시작하지만 Qita라면 1로 바꿀 것 같다)
    이상은 일역입니다.따라서 이 절차를 따라 FileReader.onload의 매개 변수 유형을 고칩니다.

    1. Type Script의 issue 제작 여부 참조


    마치 쓴 바와 같다.이때 FileReader.onLoad/onLoadEnd event argument has no target.result property의issue가 있기 때문에 이 형식을 참조하세요.

    2. json 파일 편집

    FileReader.onload의 유형을 바꾸기 위해 편집inputfiles/overridingTypes.json.inputfiles/overridingTypes.json에서 찾아보면 FileReader에 대해 이렇게 적혀 있습니다.
    inputfiles/overridingTypes.json
                "FileReader": {
                    "name": "FileReader",
                    "properties": {
                        "property": {
                            "result": {
                                "name": "result",
                                "override-type": "any"
                            }
                         }
                    }
                },
    
    이번에 onload(this: FileReader, ev: FileReaderProgressEvent) => any로 바꾸고 싶어서 이렇게 썼어요.
    inputfiles/overridingTypes.json
                "FileReader": {
                    "name": "FileReader",
                    "properties": {
                        "property": {
                            "onload": {
                                "name": "onload",
                                "override-type": "(this: FileReader, ev: FileReaderProgressEvent) => any"
                            },
                            "result": {
                                "name": "result",
                                "override-type": "any"
                            }
                        }
                    }
                }
    
    여기에 관해서 나는 현재의 TSJS-lib-generator를 확인했는데, 쓰는 방법이 바뀐 것 같다.
    또 이번에 새롭게FileReaderProgressEventinputfiles/addedTypes.json 추가된 내용은 다음과 같다.
    inputfiles/addedTypes.json
    {
        "interfaces": {
            "interface": {
                // ...
                "FileReaderProgressEvent": {
                    "name": "FileReaderProgressEvent",
                    "extends": "ProgressEvent",
                    "properties": {
                        "property": {
                            "name": {
                                "name": "target",
                                "read-only": 1,
                                "override-type": "FileReader | null"
                            }
                        }
                    },
                    "no-interface-object": "1"
                },
                // ...
            }
        }
    }
    
    name에 추가된 유형, properties에 이 유형이 가지고 있는 속성을 지정하는 등 이 파일에 대한 정의는 없지만 그 뜻을 추측할 수 있다.주의해야 할 점이 하나 있다"no-interface-object": "1".홍보 게시 후 댓글에 지적돼 추가된 것으로, 이것이 없으면 불필요한 대상으로 선언된다.

    3. 새로운dom.generated.d.ts 및 웹워커generated.제작 d.ts


    정의 형식의 json을 썼기 때문에 구축 스크립트dom를 실행합니다.generated.d.ts 및 웹워커generated.d.ts를 제작합니다.구축 스크립트는 README에 있는 것처럼 npm run build 실행할 수 있습니다.
    생성된 형식 정의 파일에 문제가 있으면 json을 조정합니다.유사한 유형 정의가 있으면 다음 단계로 넘어가세요.

    4. 베이스라인 업데이트


    TSJS-lib-generator는 생성된 유형 정의 파일을 베이스라인의 유형 정의와 비교하여 예기치 않은 변경을 감지합니다.형식 정의 파일을 다시 쓰려고 합니다. npm run baseline-accept이렇게 생성된 유형 정의 파일이 베이스라인에 반영됩니다.

    PR 보내면 accept에서 해주세요.


    여기까지의 절차를 거쳐 TSJS-lib-generator에 PR을 보내는 상태가 되었습니다!비슷한 내용을 적어서 PR을 내보낼게요.나는 Microsoft/TSJS-lib-generator#398를 낼 때 상당히 간단한 내용을 썼다.
    PR을 보내면 Microsoft의 bot이 CLA에 서명을 요청하기 때문에 서명합니다.

    여기까지만 하면 시청자 댓글이 달릴 것 같다.내용에 문제가 없으면 accept로 처리되고 머지않아 타입 스크립트 자체에 흡수되겠죠.

    총결산


    Type Script의 유형 정의를 수정하는 방법은 에 설명되어 있습니다.구조만 알면 누구나 접근할 수 있다는 걸 전할 수 있었으면 좋겠어요.
    끝은 아니지만 실제로 이것FileReader.onload에 대한 변경은 타입 스크립트 3.0이유가 있다에서 취소됐다.나는 매우 편리하다고 생각한다.
    11일째tsukakei.잘 부탁드립니다!

    좋은 웹페이지 즐겨찾기