TS:互換性のある推論のタイプ
1.互換性のある変数タイプ
-
変数xがyと互換性がある場合、yは少なくともxと同じ属性を持っている必要があります。
interface Named { name : string; } let x : Named; let y = { name : 'yivi',age : 12 }; x = y; // ok,y中拥有x的属性name
2.互換性のある機能タイプ
-
1つ目は、パラメーターの互換性です。関数xをyに割り当てることができるかどうかに応じて、xの各パラメーターはy内の対応するタイプのパラメーターを見つけることができなければなりません。(パラメーター名は関係ありません。タイプは同じです)。
let x = (a: number) => 0; let y = (b: number , s:string) => 0; y = x; // ok x = y; //error,x中缺少y的多余参数。
-
2つ目は、戻り値の互換性です。元の関数の戻り値タイプは、ターゲット関数の戻り値タイプのサブタイプである必要があります。
let x = () => ({ name : 'yivi'}); let y = () => ({ name : 'yivi',age : 20}); x = y; // ok y = x; // error,x的返回值缺少参数。
3.オプションのパラメータと残りのパラメータの不安定性
-
関数に残りのパラメーターがある場合、その関数は無制限の数のオプションのパラメーターとして扱われます。
-
これは型システムでは不安定ですが、操作の観点からは、ほとんどの関数のパススルーパスに相当します
undefined
。 -
コールバック関数のパラメーターはプログラマーには予測可能ですが、型システムには不確実です。
function foo(args : any[],callback : (...args : any[]) => void){ // 程序实现 }
4.列挙型と互換性があります
-
列挙型とデジタル型は相互に互換性があります。
-
異なる列挙型は互いに互換性がありません。
enum A { OK,ERROR}; enum B { SUCCESS,FAILED}; let status = A.OK; status = B.SUCCESS; //error!
5.クラスの互換性
-
2つのクラスタイプのオブジェクトを比較する場合、インスタンスのメンバーのみが比較されます。
-
静的メンバーとコンストラクターは含まれていません!!!
class Cat { kind : string; constructor(name : string,size : number){ } } class Dog { kind : string; constructor(name : string){ } } let c : Cat; let d : Dog; c = d; //ok d = c; //ok
6.一般的な互換性
-
typeパラメータの効果は、その結果タイプをタイプの一部として使用します。
interface Empty<T> { } let x : Empty<number>; let y : Empty<string>; x = y; //ok,由于接口里没有成员,所以y的结构和x一致
-
しかし、インターフェースにメンバーがいる場合、それは別の問題です。
interface Full<T> { data : T } let x : Full<number>; let y : Full<string>; x = y; // error!x和y的结构不一致!