私の質問は非常に簡単です。私はTypeScriptを初めて使い、あちこちで検索していますが、まだ答えが見つかりませんでした。
経験豊富なTypeScripterは、文字タイプまたはそれを実現する簡単な方法があるかどうかを知っていますか?
TypeScriptには、固定長文字列を表すための型がありません。
easyについてはわかりませんが、文字列リテラル型で何かを行うことができます:
type Char = 'a' | 'b' | 'c' | 'd' | 'e' | 'f' | 'g' | 'h' | 'i' | 'j' | 'k'
| 'l' | 'm' | 'n' | 'o' | 'p' | 'q' | 'r' | 's' | 't' | 'u' | 'v' | 'w' | 'x'
| 'y' | 'z' | 'A' | 'B' | 'C' | 'D' | 'E' | 'F' | 'G' | 'H' | 'I' | 'J' | 'K'
| 'L' | 'M' | 'N' | 'O' | 'P' | 'Q' | 'R' | 'S' | 'T' | 'U' | 'V' | 'W' | 'X'
| 'Y' | 'Z' | '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9' // etc....;
もちろん、これはかなりもろい解決策であり、ユニコード文字を考慮すると壊れます。実際に提案することはしません。 Ryanが述べているように、JavaScript自体には固定長の文字列という概念も、char
とは異なるstring
の概念もありません。
TypeGuard内で正規表現を使用してそのタイプを含めることができます。たとえば、空の列挙型を宣言して、新しいタイプをタイプガードに関連付けることができます。
enum CharType { }
export type Char = string & CharType
const isChar=(str: string): str is Char => /^(.|\n)$/.test(
str
)
export char(c:string):Char{
//you can also use is char here for to test whether actually is char
if (!isChar(c)){
throw new Error('not a char')
}
return c
}
現在、Charは、charの呼び出しからのものにのみ一致します(たとえば、ビルド時にアサートされるのではなく、関数を呼び出すことによって実際にキャストされます。コンパイラは、Charが返されることを単純に受け入れます。 )
元のソース(日付文字列に適用): アトミックオブジェクト
仮定:TypeScriptに言及することは、TypeScriptコンパイラによるコンパイル時チェックに使用される型を意味し、実際のコンパイルされたjs側での最適化の種類を探していないことを意味します(jsには文字列のみがあるため)
私が見ることができる唯一の問題は、char関数に何でも渡すことができ、実行時にのみスローされることです。ただし、Charを期待する状態に到達することはなく、何か他のものを取得することはありません(CharはCharの呼び出しからのみ取得されるため)。
サイドノートでJavaキャストはランタイム例外のみをスローします。
上記のアプローチはキャストとはあまり関係ないかもしれませんが、いくつかの共通点があります...
私が知っているように、TypeScriptの基本型にはcharは含まれていません。
Charは単なる数字です。 TypeScriptの基本的なタイプにはCharsが含まれていないため、数値を保存し、それを前後に変換することができます:
var number = "h".charCodeAt(0);
var char = String.fromCharCode(number)
そして次のように:
class Char {
private _value:Number;
constructor(char: Number | String){
this.setValue(char);
}
get getValue():String {
return String.fromCharCode(this._value);
}
set setValue(char: Number | String) {
if (typeof char === "number") {
this._value = char;
}
else {
this._value = char.charCodeAt(0);
}
}
}