2017-07-27 6 views
1
export function resize<T extends File | Blob>(input: T, w: number, h: number): Promise<T> { 
    return Promise.resolve(new File([new Blob()], 'test.jpg')) 
} 

エラー:活字体ジェネリック奇妙な行動

(48, 3) TS2322:Type 'Promise' is not assignable to type 'Promise'. Type 'File' is not assignable to type 'T'.

理由を理解することはできませんか?

+0

前もってts'dしたことはありませんが、それは 'Promise .resolve'ではありませんか? – Will

+0

ありがとう、それはこのように動作します プロミス として新しいファイル([新しいBlob()、 'test.jpg')))Promise.resolveを返すが、私はまだそれを取得しない –

+0

ガー、私はしていないtypescriptのジェネリックを十分に知っている(そして、速いスクイズの後、ドキュメントは十分な情報を持っていない。彼らは 'extends File | Blob'構文をカバーしていないので頭が傷ついている)。私は 'promise ' * works *のようにちょっとショックを受けました。どうすればいいの?[Anders?](https://en.wikipedia.org/wiki/Anders_Hejlsberg)私はあなたが* Promise .resolveを使用する必要があると思いますし、 'promise 'が結果になると思いますnull値が返されています...これについては確かですか? – Will

答えて

0

ポイントはあなたの一般的な引数ですTは、を継承するクラスです。FileまたはBlobです。あなたが戻ってきたのは単なる平凡なものですPromise<File>。明らかに継承された型に割り当てることはできません。私は正確にinput引数が何であるかわからないんだけど、それが出力にどのように影響するかが、戻り値の型は間違いPromise<File>次のようになります。これは私のために働いた

export function resize<T extends File | Blob>(input: T, w: number, h: number): Promise<File> { 
    return Promise.resolve(new File([new Blob()], 'test.jpg')) 
} 
+0

ポイントは、私は、ファイルまたはこれは私のために働いた入力タイプ に応じて、BLOBのいずれかを返す必要があるが、これは奇妙に見える '\t \t \t (ISFILE(入力)){ \t \t場合そうでなければ(TなどF)\t CONST F =新しいファイル([BLOB]、input.name) 解決}(isBlob(入力)){ 解決(TとしてBLOB) 場合} ' –

0

が、これは奇妙に見える

if (isFile(input)) { 
    const f = new File([blob], input.name) 
    resolve(f as T) 
} else if (isBlob(input)) { 
    resolve(blob as T) 
} 

から:

export 
function resize<T extends Blob | File>(input: T, width: number, height: number): Promise<T> { 

    return new Promise((resolve, reject) => { 

     const image = new Image() 

     image.onload =() => { 

      const canvas = document.createElement('canvas') 
      canvas.width = width 
      canvas.height = height 

      pica.resize(image, canvas) 
       .then((result) => pica.toBlob(result, input.type, 85)) 
       .then((blob: Blob) => { 

        if (isFile(input)) { 
         const f = new File([blob], input.name) 
         resolve(f as T) 

        } else if (isBlob(input)) { 
         resolve(blob as T) 

        } 
       }) 
       .catch(err => reject(err)) 
     } 

     image.src = URL.createObjectURL(input) 

    }) 
} 
+0

あなたは' Promise 'を安全に返すことはできません。 'T'が' File'のサブクラスであればどうでしょうか?同じタイプを返すことはできません。おそらくあなたが望むのは、 'File'をとり、' File'を返す関数宣言と 'Blob'をとり、' Blob'を返す関数宣言です。ジェネリック薬はあなたを助けていません。 – jcalz

+0

jcalzありがとう、私はあなたが正しいとオーバーロードされた関数はここでより良いアプローチになると思います –