TypeScriptで空の文字列を含まない文字列型を書く方法 質問する

TypeScriptで空の文字列を含まない文字列型を書く方法 質問する

TypeScript の関数は以下のように記述されます。

function propKeyMap(propKey:string):string {
  //TODO
}

は(空の文字列)propKeyにできません""。空の文字列を含まない型を記述できますか?

ベストアンサー1

テンプレートリテラル型を使用したソリューション

TypeScript 4.1以降では、これを実現できます。テンプレートリテラル型ただし、長さ 1 のすべての可能な文字列のユニオン型を定義する必要があるため、少し冗長になります。

type Character = 'a' | 'b' | 'c' | ...;
type NonEmptyString = `${Character}${string}`;

条件型を使用したソリューション

条件付き型とジェネリックを使用する別の解決策もあります (4.1 より前)。


type NonEmptyString<T extends string> = '' extends T ? never : T;
function propKeyMap<T extends string>(propKey: NonEmptyString<T>): string {
  //TODO
}

このソリューションは、関数を呼び出すときにジェネリックを明示的に指定する必要がないため便利です。ただし、他の場所で使用する場合は、ジェネリックを定義する必要があり、ジェネリックに使用するのと同じ型になります。

let x: NonEmptyString<'foo'>; // This is of type 'foo'
let y: NonEmptyString<string>; //This is of type never

同様に、関数に文字列を渡すことはできません (文字列には空の文字列が含まれるため、これは正しいです)。ただし、この事実と、変数を NonEmptyString として入力できないことを組み合わせると、これは変数ではなく文字列リテラルで直接呼び出される関数にのみ役立つことを意味します。

propKeyMap('foo'); // Compiles (as expected)
propKeyMap('');    // Errors   (as expected)

const x: 'foo' = 'foo';
propKeyMap(x);     // Compiles (as expected)

const y: string = 'foo';
propKeyMap(y);     // Errors   (unexpected)

この制限が許容できる場合には、最初のソリューションに必要な面倒なユニオン型の定義が含まれていないため、このソリューションをお勧めします。

おすすめ記事