私のクラスの引数の1つに文字列またはエラーを受け入れることができるようにしたいが、インライン条件を使用して型をチェックするときに型がガードされるようにする。インライン条件付き型ガード
以下の3つの例から明らかなように、インライン条件の型ガードはサポートされていないようですが、最後のものだけがコンパイルされます。これは、よりである:何らかの理由でdocumentation
UPDATEで「インライン」と呼ばれている
私は「インライン条件文」と言うとき、私は/他のブロック場合は複数行ない、フォーム(<boolean statement>)? a : b
の意味、活字体が適切に三元の文で使用されるタイプのガードを処理しない正しく
export class MyError extends Error {
public code; name; message
constructor(code: number = -1, name: string = '', err?: Error | string) {
super()
this.name = name
this.code = code
// no type guards
this.message = this.name + (err)? ": " + (err instanceof Error)? err.message : err : ''
}
}
export class MyError2 extends Error {
public code; name; message
constructor(code: number = -1, name: string = '', err?: Error | string) {
super()
this.name = name
this.code = code
if(err) {
// no type guards
this.message = this.name + ": " + (err instanceof Error)? err.message : err
} else {
this.message = this.name
}
}
}
export class MyError3 extends Error {
public code; name; message
constructor(code: number = -1, name: string = '', err?: Error | string) {
super()
this.name = name
this.code = code
// type guards... but at what cost to brevity
this.message = this.name
if(err) {
if(err instanceof Error) {
this.message += ": " + err.message
} else {
this.message += ": " + err
}
}
}
}
ある
err.message
err
かどうかを評価します:err'が受け入れる' <にErrorMessage> 'とエラーオブジェクトまたはエラーメッセージが表示された場合は、行を 'this.message = \' $ {this.name}と書くことができます:$ {err.message ||エラー} \ ';'。また、あなたのタイプは 'エラー:エラー:文字列'ではないでしょうか? ** String!== string ** – Rajesh私はそれが好きです。唯一のことは、 'err'が定義されていない場合、 ":"を持たないことです。ですから、タイプを 'Error |文字列| strictNullChecksが有効であると仮定して、「null」となります。更新された文字列の場合、歓声。 –