string
は TypeScript で文字列だということを表現する型です。以下は変数の宣言時に一緒に使っている例ですがstring
を使うと、その変数は変なことをしなければstring
が入ってるということにできます。
const str: string = 'text';
// Type '123' is not assignable to type 'string'.
const numStr: string = 123;
TypeScript は賢いので型を指定せず入れてもstring
としてくれます。
let str = 'foo';
// ok
str = 'bar'
また String Literal Types と言われる、文字列だけどある特定の文字列を型として扱うことができます。この場合はある特定の文字列しか入れることができません。
これは型定義時にある特定の文字列をstring
の代わりに使うだけです。
const foo: 'foo' = 'foo';
// Type '"foo"' is not assignable to type '"bar"'.
const bar: 'bar' = 'foo';
// typescript@^3.4.0 から以下でも同じ意味
const foo = 'foo' as const;
Union と一緒に使うことで「Aという文字列」か「Bという文字列」というように扱える値を増やすことができます。以下の'foo' | 'bar'
は、'foo'
か'bar'
だけ扱える型という意味になります。
// ok
let foo: 'foo' | 'bar' = 'foo';
// ok
foo = 'bar';
// Type '"baz"' is not assignable to type '"foo" | "bar"'.
foo = 'baz';
この String Literal Types はstring
を継承している型ということなので、string
で宣言されている部分でも代入したり渡したりできます。
const fooOrBar: 'foo' | 'bar' = 'foo';
let value: string = fooOrBar;
文字列に絞り込む
ある Union 型などで「この値はstring
か?」を調べるにはtypeof value === 'string'
が使えます。
const a: string | number = 'foo';
if (typeof a === 'string') {
a; // a: string
}