2017-01-05 8 views
4

TypeScriptサイトの "Using Type Parameters in Generic Constraints"に、以下のサンプルコードが示されています。しかし、次のエラーが発生しました:TypeScript:一般的な制約でタイプパラメータを使用する

'タイプU [keyof U]'は 'T [keyof U]'に割り当てられません。タイプ 'U' はタイプ 'T'に割り当てられません。 '

function copyFields<T extends U, U>(target: T, source: U): T { 
    for (let id in source) { 
     target[id] = source[id]; 
    } 
    return target; 
} 
let x = { a: 1, b: 2, c: 3, d: 4 }; 
copyFields(x, { b: 10, d: 20 }); 

実際には、これはプレイグラウンドで実行されません。コードの何が間違っていますか?

+0

驚くべきことに、ドキュメントのコードがコンパイルされません。この件についてhttps://github.com/Microsoft/TypeScript-Handbookレポで問題を提出することをお勧めします。 – JKillian

+1

[issue](https://github.com/Microsoft/TypeScript-Handbook/issues/475)を投稿しました。 )と返信を得た。 –

答えて

3

Uを満たすオブジェクトがTが持っていない追加のフィールドかもしれないので、それはUTに割り当て可能ではないことを意味します:だから

interface Foo { foo: number; } 
interface Bar extends Foo { bar: number; } 
interface Bar2 extends Foo { bar: string; } 

function assign<T extends U, U>(b: U): T { 
    const returnVal: T = b; // error: Type 'U' is not assignable to type 'T'. 
    return returnVal; 
} 

const bar2: Bar2 = { foo: 7, bar: "happy" }; 
assign<Bar, Foo>(bar2); 

UTに割り当て可能ではないので、ノーがあります、特定のU[keyof U]T[keyof U]に割り当てられることを保証することができます。

(私はこの説明では100%の自信を持ってないんだけど、私には意味をなさないように思われる。)


しかし、あなたは物事を入力する方法を修正することにより、あなたはcopyFieldsことのバージョンを書くことができますlike this

function copyFields<T, K extends keyof T>(target: T, source: Pick<T, K>) { 
    for (let id in source) { 
     target[id] = source[id]; 
    } 
    return target; 
} 
+0

ありがとうございました。私はあなたの説明を理解しました。そして、改訂されたコードは正常に動作します。 –

関連する問題