我有一些香草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

但是我得到了如下错误。

元素隐式具有“any”类型,因为类型“string”的表达式>不能用于索引类型“{"A":字符串;}”。 在类型>'{" a ":字符串上没有找到具有类型为'string'的参数的索引签名;}’.ts (7053)

我认为问题是我需要我的对象键是一个字符串。但是将它们转换为字符串并不管用。

DNATranscriber = {
       "G":"C",
       "C": "G",
       "T": "A",
       "A": "U"
    }

我对此很困惑。它表示在我的对象上不存在具有字符串类型的索引签名。但我确信它确实如此。我做错了什么?

编辑-我通过给DNATranscriber对象一个any类型来解决这个问题。

DNATranscriber: any = {
    "G":"C",
    "C":"G",
    "T":"A",
    "A":"U"
}

当前回答

在你的参数中,你必须定义keyOf对象。

interface User {
    name: string
    age: number 
}

const user: User = {
    name: "someone",
    age: 20
}

function getValue(key: keyof User) {
    return user[key]
}

其他回答

我在对象中使用{[x:string]:string}。

const myObj:{[x:string]:string} = {
  'a': 'b'
};

function myFn() {
  const getVal = myObj['a'];
};

对于那些谷歌的人:

在类型…上没有找到参数类型为'string'的索引签名。

你的错误很可能是这样的:

你的意思是使用一个更具体的类型,如keyof Number 而不是字符串?

我用这样的代码解决了一个类似的输入问题:

const stringBasedKey = `SomeCustomString${someVar}` as keyof typeof YourTypeHere;

这个问题帮助我了解了错误的真正含义。

我的解决方案是

type DNATranscriber = {
   G: string,
   C: string,
   T: string,
   A: string,
}
type DNATanscriberIndex = {
   [key: string]: string
}

let variableName:DNATanscriberIndex&DNATanscriber

DNATranscriber类型是为了Typescript能够引用字段,DNATanscriberIndex类型是为了将索引声明为字符串

对于任何遇到类似情况的人来说

No index signature with a parameter of type 'string' was found on type X

试着把它用在简单的对象上(用作字典),比如:

DNATranscriber = {
   G:"C",
   C: "G",
   T: "A",
   A: "U"
}

并尝试从计算的键动态访问值,如:

const key = getFirstType(dnaChain);
const result = DNATranscriber[key];

如果你遇到如上所示的错误,你可以使用keyof操作符并尝试类似的操作

const key = getFirstType(dnaChain) as keyof typeof DNATranscriber;

当然,你需要一个守卫的结果,但如果它似乎比一些自定义类型魔术更直观,这是可以的。

这里有一个不使用对象键的解决方案:

function toRna(value: string): string {
  return value.split('').map(ch => 'CGAU'['GCTA'.indexOf(ch)]).join('');
}

console.log(toRna('ACGTGGTCTTAA')); 
\\UGCACCAGAAUU