2017-07-29 5 views
2

「基本」オブジェクトからタイプを保持したままこ​​の問題を解決するにはどうすればよいですか? 。typescriptは、オブジェクトがスプレッドタイプのオブジェクトでなければならないと不平を言っているのはなぜですか?

function aFunction<T extends object>(base: T) { 
    const anObject = { test:"value" } 
    if (typeof base !== 'object') { return } 

// the following line causes a TSC error, saying that spread types can only be 
// created from object types and highlighting base as the problem... wut? 

    const merged = { ...base, anObject } 
    return merged 
} 

たとえば、次のようにコンパイラエラーは発生しませんが、 'base'のすべての型情報が失われます。

function aFunction(base: object) { 
    const anObject = { test:value } 
    if (typeof base !== 'object') { return } 

    const merged = { ...base, anObject } 
    return merged 
} 

答えて

2

<T extends object>(base: T)baseは、ジェネリック型Tであることを意味します。

そして、TypeScriptのタイプシステムは、まだジェネリックタイプを理解していません。 (#10727

回避策:

  1. 解決すべき#10727ため...

  2. 待ちを使用しないようにコードをリファクタリング。他のタイプのチェッカーに

  3. 変更は、例えば、フロー:

フローは、あなたのコードには、エラーを報告しません:

/* @flow */ 

function aFunction<T: Object>(base: T) { 
    const anObject = { test:"value" } 
    if (typeof base !== 'object') { return } 

    const merged = { ...base, anObject } 
    return merged 
} 
+0

ありがとうございます。タイプ情報を保持するタイプコピーでオブジェクトをマージすることをお勧めしますか?私はオブジェクトを主張するためにリファクタリングしました。作品はちょっとハッキリしています。 const merged = <オブジェクトのタイプとタイプ> {... base、anObject} – laramie

+0

@laramie私はどのようにわかりませんか。代わりに回避策として 'Object.assign'を使用します。 – weakish

1

広がり、残りはまだ現時点ではジェネリックではサポートされていません。

0

最初のスニペットのベースはオブジェクトから継承するtype Tです。さて、あなたはjavascriptでそれほど強い関係ではなく、is aの関係ではないので、Tは必ずobjectであるとは限りません。 Tはプロトタイプ的にオブジェクトから継承しています。また、typescriptはジェネリックのための理解がありません。

コードスニペット2 baseはtypeオブジェクトですが、typescriptはオブジェクトの広がりをサポートしています。オブジェクトタイプの値を広げることができます。この機能は主にオブジェクトのコピーを作成するために使用されます。エラー。

+0

これは#10727のようにTypeScriptの弱点に過ぎません。 – weakish

関連する問題