文字列入力を受け取り、その文字列を文字に分割し、それらの文字をオブジェクトのキーと照合する、標準的な JavaScript コードがあります。
DNATranscriber = {
"G":"C",
"C": "G",
"T": "A",
"A": "U"
}
function toRna(sequence){
const sequenceArray = [...sequence];
const transcriptionArray = sequenceArray.map(character =>{
return this.DNATranscriber[character];
});
return transcriptionArray.join("");
}
console.log(toRna("ACGTGGTCTTAA")); //Returns UGCACCAGAAUU
これは期待どおりに動作します。これを TypeScript に変換したいと思います。
class Transcriptor {
DNATranscriber = {
G:"C",
C: "G",
T: "A",
A: "U"
}
toRna(sequence: string) {
const sequenceArray = [...sequence];
const transcriptionArray = sequenceArray.map(character =>{
return this.DNATranscriber[character];
});
}
}
export default Transcriptor
しかし、次のエラーが発生します。
'string' 型の式は '{ "A": string; }' 型のインデックスに使用できないため、要素は暗黙的に 'any' 型を持ちます。 '{ "A": string; }' 型に 'string' 型のパラメータを持つインデックス シグネチャが見つかりませんでした。ts(7053)
問題は、オブジェクト キーを文字列にする必要があることだと考えました。しかし、文字列に変換しても機能しませんでした。
DNATranscriber = {
"G":"C",
"C": "G",
"T": "A",
"A": "U"
}
これにはかなり困惑しています。オブジェクトに文字列型のインデックス署名が存在しないと表示されます。しかし、確かに存在するはずです。何が間違っているのでしょうか?
編集 - DNATranscriber オブジェクトに any 型を与えることでこの問題を解決しました。
DNATranscriber: any = {
"G":"C",
"C":"G",
"T":"A",
"A":"U"
}
ベストアンサー1
また、次のこともできます:
(this.DNATranscriber as any)[character];
編集。
ではなく適切な型でオブジェクトをキャストすることを強くお勧めしますany
。オブジェクトを としてキャストするany
と、TypeScript をコンパイルするときに型エラーを回避するのに役立ちますが、コードを型安全に保つのには役立ちません。
例えば
interface DNA {
G: "C",
C: "G",
T: "A",
A: "U"
}
そして、次のようにキャストします。
(this.DNATranscriber as DNA)[character];