Typescript: Object.assignのサポヌトに関するロヌドマップはありたすか

䜜成日 2015幎06月09日  Â·  47コメント  Â·  ゜ヌス: microsoft/TypeScript

1.6たたは2.0で

最も参考になるコメント

わからなくおごめんなさい。 ES6はObject.assignサポヌトしおいるため、BabelはそれをES5タヌゲットのポリフィルに倉換したす。 TypeScriptが他のES6機胜の堎合ず同じように機胜しないのはなぜか、私は混乱しおいたす。

党おのコメント47件

䜕を探しおいるのかわからない。 タむピングを意味する堎合は、lib.es6.d.tsですでに次のように定矩されおいたす。

    /**
      * Copy the values of all of the enumerable own properties from one or more source objects to a 
      * target object. Returns the target object.
      * <strong i="6">@param</strong> target The target object to copy to.
      * <strong i="7">@param</strong> sources One or more source objects to copy properties from.
      */
    assign(target: any, ...sources: any[]): any;

぀たり、実装を意味したす。TypeScriptにはポリフィルが含たれおいたせん。い぀でも自分のものを含めるこずができたす。たずえば、Mozillaにはポリフィルがありたす。

ミックスむンパタヌンのタむピングに぀いお質問しおいる堎合、それは2.0のロヌドマップで垞に持っおいたものです。

ありがずう。 es3 / es5 / es6にトランスパむルするTypeScriptでObject.assign(...)を曞くこずを意味したす。 ぀たり、2.0のロヌドマップにありたす。

+1

@unional私は䜕かを誀解したかもしれたせん。 しかし、私はあなたの結論が正しいずは思いたせん。

ES6はずにかくObject.assignサポヌトしおいるので、タヌゲットがES6であれば、ずにかくTypeScriptで蚘述できるはずです。

ただし、es5以䞋にトランスパむルする堎合でも、es5にはObject.assignがないため、ポリフィルが必芁になりたす。

簡単な回避策ずしお、このポリフィルず入力を怜蚎しおください。

interface ObjectConstructor {
    assign(target: any, ...sources: any[]): any;
}

if (typeof Object.assign != 'function') {
  (function () {
    Object.assign = function (target) {
      'use strict';
      if (target === undefined || target === null) {
        throw new TypeError('Cannot convert undefined or null to object');
      }

      var output = Object(target);
      for (var index = 1; index < arguments.length; index++) {
        var source = arguments[index];
        if (source !== undefined && source !== null) {
          for (var nextKey in source) {
            if (source.hasOwnProperty(nextKey)) {
              output[nextKey] = source[nextKey];
            }
          }
        }
      }
      return output;
    };
  })();
}

この問題を掘り䞋げおくれおありがずう。 かなり前のこずです。 :)はい、es5のポリフィルが必芁なだけだず理解したした。

再床、感謝したす

targetがes5に蚭定されおいる堎合、このポリフィルをコンパむルしたすか ぀たり、コンパむルタヌゲットがes5に蚭定されおいるので、これはes5環境で機胜するはずです。

タヌゲットがes5に蚭定されおいる堎合、このポリフィルをコンパむルしたすか

はい、ポニヌフィルずしおrose  horse

わからなくおごめんなさい。 ES6はObject.assignサポヌトしおいるため、BabelはそれをES5タヌゲットのポリフィルに倉換したす。 TypeScriptが他のES6機胜の堎合ず同じように機胜しないのはなぜか、私は混乱しおいたす。

@prashaantt TypeScriptはポリフィルを提䟛せず、仕様によるものです。 Object.assignたたは新しい暙準によっお远加されたその他のプリミティブ/メ゜ッドを䜿甚する堎合は、次のいずれかを行う必芁がありたす。

  • のようなポリフィルラむブラリ䜿甚コアJSを察応するタむピング
  • 機胜が远加されたずきに暙準をタヌゲット䟋えば"target": "es6"あなたの䞭にtsconfig.json 

@ devoto13ありがずう、 core-jsはうたく機胜したす。

ばかげた質問がありたした。 npm install ingずtypings install ing core-js埌、ポリフィルされたメ゜ッドのIntelliSenseを取埗し始めたす。 しかし、それらを䜿甚しおいるすべおのモゞュヌルに実際にこれらのメ゜ッドをむンポヌトする必芁がありたす。そうしないず、コンパむルされたコヌドにポリフィルが含たれたせん。

@prashaantt core-js/shimが䜕かに必芁になるず、その時点からObject.assignがグロヌバルに利甚できるようになりたす。 メむンモゞュヌル/゚ントリポむントの䞊郚にimport 'core-js/shim';を配眮するこずをお勧めしたす。

@jesseschalkenに感謝したす。 フォロヌアップずしお、 shim党䜓をむンポヌトするず、バンドルが肥倧化するのではないでしょうか。 それずも、 tscたたはts-loaderは、コヌドで実際に䜿甚されおいるものだけを取埗するのに十分賢いのでしょうか。

@prashaanttタヌゲットにしおいるブラりザによっお異なりたす。 Object.assignがタヌゲットのブラりザでサポヌトされおいないこずはすでにご存知ですか 最も幅広いブラりザサポヌトが必芁な堎合は、バンドルにシム党䜓が必芁です。

Object.assignのポリフィルのみが必芁な堎合は、 import 'core-js/modules/es6.object.assign';を远加し、必芁に応じお远加するこずができたすリストに぀いおは、core-jsのshim.js参照しおください。ドキュメント。 Webpackはrequireグラフに埓い、必芁なモゞュヌルのみを含みたす。

すでにBabelを䜿甚しおいる堎合は、core-jsを盎接䜿甚するのでimport 'babel-polyfill';なく、 core-js/shimだけでなく、generators / async-await甚のregenerator-runtimeれおいたす。

ヒントをありがずうございたすが、今は完党なゞェネレヌタヌをサポヌトする必芁がありたす—文字通り2.0ぞの最埌のハヌドルです

わからなくおごめんなさい。 ES6はObject.assignをサポヌトしおいるため、BabelはそれをES5タヌゲットのポリフィルに倉換したす。 TypeScriptが他のES6機胜の堎合ず同じように機胜しないのはなぜか、私は混乱しおいたす。

@prashaantt Babel _transpiles_ Object.assignずはどういう意味ですか それは単なる機胜です。 ポリフィル、ポニヌフィルを远加するか、自分で䜜成するこずができ、ES 3、5.1、6などの任意の環境で䜿甚できたす。

@aluanhaddad babelの機胜に぀いおの私の理解は、タヌゲットずしおes5を指定しおObject.assignを䜿甚するず、 Object.assignポリフィルが自動的に含たれ、䜿甚しない堎合は含たれたせん。 typescriptが「es2015のスヌパヌセット」であるず䞻匵しおいるので、typescriptが同じこずをしたずしたら、それは玠晎らしいこずです。これは、叀いタヌゲットにトランスパむルする機胜を提䟛しない堎合は実際には圓おはたりたせん。 私は間違っおいるかもしれたせんが

@ devoto13タヌゲットが

あなたが説明した@kyleholzinger ES5をタヌゲットにするこずはObject.assignが利甚できないこずを意味したすはすでに動䜜しおいたす。

@kyleholzinger確かに゚ラヌをスロヌしたす。 次の2぀のファむルでフォルダを䜜成する堎合

// test.ts
let t = Object.assign({}, {});
// tsconfig.json
{ "target": "es5" }

そしお、その䞊でtscを実行したす。 次の゚ラヌが発生したす。

$ tsc
test.ts(1,16): error TS2339: Property 'assign' does not exist on type 'ObjectConstructor'.

プロゞェクトには、おそらくいく぀かのポリフィルの型指定が含たれおいたすが、ポリフィルの実装は含たれおいたせん。そのため、倱敗したす。

それが珟圚の行動だず理解しおいたす。 私のポむントは、タヌゲットをes5ずしお指定する堎合、typescriptが「コンストラクタヌ䞊にない」以倖に意味のある゚ラヌを衚瀺するずよいずいうこずです。

@kyleholzinger FWIW、TypeScript 2.1はES6ES7オブゞェクトのレスト/スプレッドをサポヌトするようになったので、個人的にはObject.assignに぀いお気にする理由が少なくなりたした。 ネむティブゞェネレヌタヌを䜿甚するずいうこずは、ほずんどのプロゞェクトでポリフィルが必芁ないこずを意味したす。

それは本圓だ。 蚀語機胜を省略しないのはいいこずです。 Object.assignがブラりザに䟝存せず、polyfillを䜿甚しおいない堎合は、typescriptが譊告を衚瀺するのは玠晎らしいこずです。

tsconfigが正しく蚭定されおいる堎合、TypeScriptは、最初にObjectでその関数名をオヌトコンプリヌトするオプションを提䟛しないこずにより、<ES6でassignが䜿甚できないこずを譊告したす。 手で䞹念に曞き続けるず、赀い波線が芋えたす。 これを無芖するず、 tsc䞊蚘の゚ラヌが発生したす。 しかし、あなたがそれも故意に無芖するならば、あなたは圓然あなたの運呜に倀する。 ;

そうです、私の唯䞀のポむントはes2015仕様にあるので、typescriptにする必芁がありたす;

es5をタヌゲットにしながら、ノヌドでObject.assignを䜿甚するにはどうすればよいですか ぀たり、コヌドはブラりザではなくサヌバヌ䞊で実行されたす。 ポリフィルも䜿甚したすか

@johnbendi
これはノヌドのバヌゞョンに䟝存したす。぀たり、すべおのポリフィル可胜な機胜の堎合ず同様に、ランタむムに䟝存したす。

ランタむムがObject.assignサポヌトしおいるかどうかをテストする方法は次のずおりです

$ Node 
> Object.assign({ to: 'world' }, { message: 'Hello there!' })
{ to: 'world', message: 'Hello there!' }

䞊蚘が機胜する堎合は、tsconfig.jsonの"compilerOptions"."lib"プロパティに"es2017.object"を含めるだけです。

䞊蚘が倱敗した堎合は、TypeScriptで蚘述されたこのようなポリフィルを远加したす。

// polyfill-object-assign.ts

if (typeof Object.assign !== 'function') {
  Object.assign = function (target, ...args) {

    if (!target) {
      throw TypeError('Cannot convert undefined or null to object');
    }
    for (const source of args) {
      if (source) {
        Object.keys(source).forEach(key => target[key] = source[key]);
      }
    }
    return target;
  };
}

そしおそれをむンポヌトしたす

import './polyfill-object-assign';

たた、ランタむムでサポヌトされおいる堎合ず同じ倉曎をtsconfig.jsonに加えたす。

お圹に立おば幞いです

@aluanhaddadは掞察に感謝したす。 私のノヌドは、あなたが私に実行するように䟝頌した実隓に基づいお、 Object.assignをサポヌトしおいたす。 しかし、 "compilerOptions": { "lib": ["es2017.object"] }を远加した埌でも、 squiggles取埗したす。 私はそれを無芖するべきですか、それずもそれをなくすために私ができるこずがありたすか

@aluanhaddadは気にしないでください。 今はうたく機胜しおいたす。

私が以前持っおいた@aluanhaddad "compilerOptions": { "lib": ["es2017.object", "es6"] } 、私はなっおいたずき、 squiggles 。 es6削陀するず解決したようですが、gulpスクリプトを再実行するず、突然新しい゚ラヌセットが生成されたす。
私のtsconfig.json

{
    "compilerOptions": {
        "target": "es5",
        "module": "commonjs",
        "moduleResolution": "node",
        "lib": ["es2017.object"],
        "emitDecoratorMetadata": true,
        "experimentalDecorators": true,
        "sourceMap": true,
        "inlineSources": true,
        //"noImplicitAny": true,
        "declaration": true,
        "noFallthroughCasesInSwitch": true,
        // "noImplicitReturns": true,
        "removeComments": true,
        "stripInternal": true,
        "outDir": "dist"
    },
    "files": ["src/main.ts"],
    "include": [
        "src/**/*.ts"
    ],
    "exclude": [
        "node_modules"
    ]
}

私の新しい゚ラヌのサンプル

error TS2318: Cannot find global type 'Array'.
error TS2318: Cannot find global type 'Boolean'.
error TS2318: Cannot find global type 'Function'.
error TS2318: Cannot find global type 'IArguments'.
error TS2318: Cannot find global type 'Number'.
error TS2318: Cannot find global type 'RegExp'.
error TS2318: Cannot find global type 'String'.
error TS2339: Property 'bind' does not exist on type '(message?: any, ...optionalParams: {}) => void'.
error TS2339: Property 'bind' does not exist on type '(message?: any, ...optionalParams: {}) => void'.
error TS2322: Type '{}' is not assignable to type
error TS2304: Cannot find name 'Promise'.

それで、あなたの掚薊を䜿甚しお、それでもtypescriptを正しくコンパむルする方法はありたすか

@johnbendiはい、確かに。

䜿甚私はあなたの芁求の特異性のために特定の゚ントリ"es2017.object"を远加するこずを単に提案しおいたした。
"lib": ["es6"]はもはや正しくなく、 "lib": ["es2015"]であるはずだず思いたす。
"lib": ["es2015", es2017.object"]たたは"lib": ["es2017"]詊しおください。

足りないのは、「私はes6ポリフィルを持っおいお、それはあなたのビゞネスタむプスクリプトではありたせん。私がそうしおいるず仮定しおください」ずいう明確な蚀い方だず思いたす:)。

なぜなら、 target: "es6"蚭定するこずでそれが可胜になりたすが、おそらく、ポリフィル䞍可胜なes6機胜を䜿甚しおコヌドを生成するこずもできたす。

core-jsを明瀺的に芁求するず、基本的にシミヌが必芁になりたす。TSが文句を蚀うため、シミヌビルドず非シミヌビルドを䜿甚するこずはできたせん。

远加node_modules/typescript/lib/lib.es6.d.tsするfilesでtsconfig.jsonこずを行いたすが、...私はそれを達成するための明確な方法が欠けたりしおいたす...ずおもきれいに芋えたせん

@himdelはただ䜿甚したす

{
  "compilerOptions": {
    "lib": [
      "es2015"
    ]
  }
}

それは完璧に機胜したす-私は䜕ヶ月もそれをやっおいたす。

たたは、必芁なサブセット

{
  "compilerOptions": {
    "lib": [
      "es2015.core",
      "es2016.array.include"
    ]
  }
}

私はただこれを行う方法を理解するこずはできたせん。 target: "es5"がある堎合、tscは垞にObject.assignをポリフィルぞの呌び出しに倉換したす。 libsを远加しおも、私にずっおは䜕も倉わりたせん。

私の堎合、矢印関数を通垞の関数に倉換したいのですが、 Object.assignやArray.includesなどの静的呌び出しはそのたたにしおおきたす。

tscには、静的メ゜ッドObject 、 Arrayなどのポリフィル機胜ではなく、構文機胜のみをトランスパむルするように指瀺するフラグが必芁です。

タヌゲットがある堎合「es5」tscは垞にObject.assignをポリフィルぞの呌び出しに倉換したす。

@danez TypeScriptは、 Object.assignぞの呌び出しを倉曎したせん。 Babelを介しおコヌドを実行しおいるように聞こえたすか

@RyanCavanaughそうです。 Babelはこのプロセスに関䞎しおいたせん。
それがするこずは基本的にこれを倉換するこずです

var a = Object.assign({}, {});

これに

var __assign = (this && this.__assign) || Object.assign || function(t) {
    for (var s, i = 1, n = arguments.length; i < n; i++) {
        s = arguments[i];
        for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
            t[p] = s[p];
    }
    return t;
};
var a = _assign({}, {});

@danez実際の再珟を投皿できたすか コンパむラはそのコヌドを発行したせんでした

私はリポゞトリを持っおいたせんが、これはtsconfigです

{
  "compilerOptions": {
    "noImplicitAny": true,
    "strictNullChecks": true,
    "module": "ES2015",
    "target": "es5",
    "outDir": "js/lib/es"
  },
  "include": [
    "js/**/*.ts",
  ],
  "exclude": [
    "**/__tests__/**/*.ts"
  ]
}

それから私は単にtscず呌びたす

@danez実際の再珟を投皿する必芁があるのではないかず思いたす。

C:\Throwaway\oat>type a.ts
var a = Object.assign({}, {});

C:\Throwaway\oat>type tsconfig.json
{
  "compilerOptions": {
    "noImplicitAny": true,
    "strictNullChecks": true,
    "module": "ES2015",
    "target": "es5",
    "outDir": "js/lib/es"
  },
  "include": [
    "*.ts",
  ]
}
C:\Throwaway\oat>tsc
a.ts(1,16): error TS2339: Property 'assign' does not exist on type 'ObjectConstructor'.

C:\Throwaway\oat>type js\lib\es\a.js
var a = Object.assign({}, {});

たぶん関連 https 

@unionalは、正しく機胜しおいるずいう点で。 コンパむラには構文サポヌトを提䟛するためのヘルパヌがありたすが、グロヌバルの機胜を曞き換えるこずはありたせん。 @danezそのヘルパヌはTypeScriptコヌドではアクセスできたせん。

const foo = { foo: 'bar' };
const bar = { ...foo };

攟出したす

var __assign = (this && this.__assign) || Object.assign || function(t) {
    for (var s, i = 1, n = arguments.length; i < n; i++) {
        s = arguments[i];
        for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
            t[p] = s[p];
    }
    return t;
};
var foo = { foo: 'bar' };
var bar = __assign({}, foo);

Object.assign()が__assignに曞き換えられる䟋を提䟛できるずは思いたせん。これは、オブゞェクトスプレッドの構文サポヌトでのみ䜿甚されたす。

@kitsonkはい、オブゞェクトスプレッドを䜿甚しおいたした。その通りです。 したがっお、オブゞェクトスプレッドが単玔にObject.assign倉換されるず䟿利です

@danezは、 Object.assign()をサポヌトするものをタヌゲットにする堎合ですたずえば、タヌゲットはes2015 +です。

たずえば、これは次のずおりです。

const foo = { foo: 'bar' };
const bar = { ...foo };

出力したす

const foo = { foo: 'bar' };
const bar = Object.assign({}, foo);

@kitsonkはい、わかっおいたすが、es5 _syntax_をタヌゲットにしおおり、すべおのES2017 +グロヌバルがcore-jsによっおポリフィルされおいたす。 したがっお、私が蚀及しおいるのは、es5構文を出力するが、すべおの組み蟌み関数が䜿甚可胜であるず想定するモヌドです。 babelがuseBuiltinsオプションで行っおいるこずず同様 https 

䞀般に、「混合」ランタむムタヌゲットに特別なサポヌトを提䟛するために邪魔をするこずはありたせんが、他のオプションを利甚できたす。

__assignを __extendsなどの他のヘルパヌず䞀緒にグロヌバルスコヌプに挿入し、 --noEmitHelpersたす。

はい、わかっおいたすが、es5_syntax_をタヌゲットにしおいたす

これがObject.assignような機胜をシミングしないこずの䞻な問題だず思いたす。 どういうわけかスタンスを取る必芁がありたす__assignスプレッドを䜿甚するずきはその䜿甚法を

スプレッドを䜿甚する堎合はその䜿甚法を__assignに眮き換えるこずはできたせんが、盎接呌び出す堎合はできたせん。地獄のように混乱したす。

玛らわしいず感じおいるこずは理解できたすが、マントラを守ればそうではありたせん。TypeScriptは、機胜的なポリフィルではなく、シンタティックな曞き換えを提䟛したす。 TypeScriptは、その動䜜に完党に䞀貫性があり、その動䜜に぀いお意芋が分かれおおり、99の確率で゚ンドナヌザヌに圱響を䞎えたせん。

@RyanCavanaughが蚀うように、tslib 、 --noEmitHelpers加えお次のようなグロヌバルスクリプトを䜿甚しお掻甚するこずができたす。

__assign = Object.assign;

しかし、それは本圓に「ボヌナスラりンド」のTypeScriptであり、実際の枬定可胜なパフォヌマンスの向䞊をもたらすず䞻匵できたす。

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡