TypeScriptの型入門で疑問に思った点を書いていく
参考
用語まわり
部分型
AがBに代入可能である場合、AはBの部分型と言える。サブタイプ
code:typescript
const foo = 'foo'; // foo is 'foo' type.
const bar: string = foo; // bar is string type.
上記の場合、変数fooは'foo'という文字リテラル型である。
文字リテラル型は文字列型に代入可能なので、文字リテラル型は文字列型の部分型となる。
keyof
typeofの章で、以下のようなコードが記載されていた。
code:typescript
interface MyObj {
}
// MyObjKey = string | number
type MyObjKey = keyof MyObj;
この例で定義したMyObj型は任意のstring型の名前に対してその名前のプロパティはnumber型を持つという意味になっています。
ということは、MyObj型のオブジェクトのキーとしてはstring型の値すべてが使用できます。
よって、keyof MyObjはstringになることが期待できますね。
しかし、実際にはこれはstring | numberとなります。'
これは、数値の場合もどうせ文字列に変換されるのだからOKという意図が込められています。
最初見たときは [foo: string]: number;の number が影響を与えているのかと勘違いしたが、そうではなかった。
code:typescript
type ObjType = keyof Obj; // type ObjType = string | number
そもそもインデックスシグネチャの場合はstring型のプロパティはsting | number型になる。
また、インデックスシグネチャの場合プロパティの型として許可されているのは、string or number のみ。
以下のように、string か number 以外を指定するとエラーになる。
code:typescript
type Obj = {
// An index signature parameter type must be either 'string' or 'number'.ts(1023)
}