エヴァン・マーティンという名前のGoogleの従業員が、最近でGitHubのレポ活字体で公開され、「Tucaoを」活字する(つまり、言及する問題を)、Tucaoは、適切でない可能性に正確であると言われ 活字体3.5フィードバックを使用。
3ヶ月間の活字体3.5リリース(が最新の安定バージョン3.6は、先月末までにリリースされている)が、Googleの開発チームは、最近、バージョン3.5にアップグレードされました。使用期間の後、開発者は話すために強い感じなので、このフィードバックの質の高さがあります。はい、ここでのプロジェクトはすべてGoogleが使用されていること-だけコードリポジトリことと、コードの行数十億持つグーグルでは。
背景
開発チームが直面しているプロジェクトは、コードグーグルの行数十億を持つことである、チーム内で、すべてのメンバーがアップグレードするには、すべてのプラットフォームのコンパイラフラグ(コンパイラフラグ)を越え活字体の同じバージョンと同じグループを使用している、メンバーは意志これらのタグをアップグレードするために皆のために役立ちます。
エヴァンは彼と誰もが活字体アップグレードの新バージョンは、いくつかの改善をもたらすことができる期待される、と述べました。例えば、エヴァンは、彼はそれが似ていますが、コードベースの定義から除去する必要性に対応していないことを意味しても、歓迎し、標準ライブラリの改善に期待しています。しかし、チームは余分なワークロード活字体3.5アップグレードは、以前のアップグレードよりも多くを持参することがわかりました。
エヴァンは、バージョン3.5を信じて、アップグレードが特に難しい、彼はなっ作るための3つの主要な変更があり、これらの変更は、その目的のほとんどと考えている、と型チェックの向上を目的としたが、彼はまた、活字体チームは、常に型チェックを理解することを信じては、しかし、セキュリティと効率の間のトレードオフ。
エヴァンは、より良い未来似たような状況を評価するために活字体のチームを助ける、といくつかの提案を提供するためにフィードバックを使用して、この大規模なコードベース活字体を願っています。
エヴァンは、以下のチームへの影響と、バージョン3.5で3つの大きな変化を見てみましょう。
一般的な暗黙のデフォルト値(ジェネリック医薬品のための暗黙のデフォルト)
この機能は、3.5のリリースに属している破壊的な変更、エヴァンは、コードが行う汎用コードで動作するように関連していない問題が原因だと思います。例えば、約束が解決持ついくつかのコードがあると仮定しますが、約束を解析する値を気にしません。
function dontCarePromise() {
return new Promise((resolve) => {
resolve();
});
}
ジェネリック医薬品がバインドされていないため、3.4で Promise<{}>
コード3.5に変更されますPromise<unknown>
。この機能の利用者はどこにでも約束のこのタイプを書き込む場合:
const myPromise: Promise<{}> = dontCarePromise();
これは、型エラーになります。
また、この場合の「唯一のジェネリック(返却のみのジェネリック医薬品)を返す」モードで、いずれかのモードの戻り値の型でそれを使用する唯一の汎用的な機能が呼ばれています。ここでの問題は、型推論の事故の多くがあるだろう、原因です。例えば、唯一の一般的な、次のコードを返す場合には:
expectsString(myFunction());
合法的に次のように再構築することができます:
const x = myFunction();
expectsString(x);
しかし、最終的に我々はそれが動作していないことが判明します。
ブールフィルタフィルタ(ブール)
変更活字体3.5 Boolean
関数の型を、関数が強制的に割り当てられますboolean
から
function Boolean(value?: any): boolean;
への変更
function Boolean<T>(value?: T): boolean;
どちらも、非常によく似て見えることがあります。しかし、述語を取り、フィルターの配列を返す関数を想像し、上記と同じコードを使用します。
function filter<T>(predicate: (t: T) => boolean): (ts: T[]) => T[];
const myFilter = filter(Boolean);
、定義により、バージョン3.4 T
から any
の変化myFilter
、およびなる 機能。しかし、3.5バージョンでは、 唯一のジェネリック医薬品を残します。any[]
any[]
T
コレクション(セット)
活字体3.4、次のコードでは:
const s = new Set();
それは戻ります Set<any>
。活字体3.5しかし、そこに変更がいるので、だった lib.es2015.iterable.d.ts
との除去 any
効果は、上述した一般的な変化を引き起こし、そして型が派生されます unknown
。
最後に、エラーの種類は時々実際の問題の遠く及ばので、修復するこの変更は、最終的には難しいです。たとえば、次のコードで:
class C {
gather() {
let s = new Set();
s.add('hello');
return s;
}
use(s: string[]) { … }
demo() {
this.use(Array.from(this.gather()));
}
}
私たちは、受け取ります Array.from
、エラーのプロンプトが、それを修正するための実際の必要性を new Set()
。
遂に
エヴァンは、ちょうど彼らがより良い活字体を開発するための新機能の設計にいくつかの基準を提供するチームになることを願っています彼らは活字体、フィードバックの使用に非常に満足していたと述べました。