TS#8:タイプ空間と値空間を区別する符号


タイプ空間と値空間を区別する記号
typescriptのシンボルは、タイプ空間または値空間の1つに存在します.
interface Cylinder {
  radius: number;
  height: number;
}
const Cylinder = (radius: number, height: number) => ({radius, number});
上記のコードではinterfaceがタイプとして使用され、constが値として使用されますが、互いに関連はありません.
function calculateVolume(shape: unknown) {
  if(shape instanceof Cylinder) {
    shape.radius // error
  }
上記のコードでは、shpaeがCylinderタイプであるかどうかを確認するためにコードが記述されていますが、instanceofは実行時に行われ、値が参照されているため(値は後述)、関数が参照されてエラーが発生します.
象徴がタイプなのか価値なのかを判断するには、文脈から見るべきだ.
もちろん、もっと重要なのは適切な名前をつけて、相応の間違いが起こらないようにすることだと思います.
interface Person {
  first: string;
  last: string;
}
const p: Person = {first: 'Jane', last: 'Jacobs' };

function email(p: Person, subject: string, body: string): Response {
  // ...
}

type T1 = typeof p;
type T2 = typeof email;

const v1 = typeof p;
const v2 = typeof email;
上記のコードでは、T 1、T 2はタイプスクリプトのタイプを返し、v 1、v 2はjs実行時の値である.
T1, T2 => Person, (p: Person, subject: string, body: string) => Response
v1, v2 => object, function
だからtsとjsの境界でよく考えなければなりません.
function email({person: Person, subject: string, body: string}) {
  // .. 오류
}

function email(
 {person, subject, body}: {person: Person, subject: string, body: string}
) {
   // ..
}
最初のEメールでエラーが発生し、typescriptで構造割り当てを行うとPerson値に値としてロードされ、stringという変数名で2通割り当てられます.
typescriptで構造分解割り当てを行う場合は、タイプと値を区別し、正常に動作するようにそれぞれ明記する必要があります.
  • タイプのスクリプトでは、タイプと値が混同されることが多いため、タイプと値の区別方法を十分に利用する必要があります.
    内明も常に注意して、もっとよくしなければなりません.
  • 「foo」は、文字列タイプであってもよいし、文字列タイプであってもよい.二つの状況をよく区別しなければならない.
  • type ofは、それを使用する場合は、値とタイプを慎重に計算する必要があります.