我有一些普通的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":string;}‘。在类型>'{ "A":string;}‘.ts上未找到参数类型为'string’的索引签名(7053)
我认为问题是我需要我的对象键是一个字符串。但将它们转换为字符串并不起作用。
DNATranscriber = {
"G":"C",
"C": "G",
"T": "A",
"A": "U"
}
我对此感到非常困惑。它说明我的对象上不存在具有字符串类型的索引签名。但我确信它确实是这样的。我做错了什么?
Edit -我通过给DNATranscriber对象一个any类型来解决这个问题。
DNATranscriber: any = {
"G":"C",
"C":"G",
"T":"A",
"A":"U"
}
发布于 2019-06-13 03:33:14
您可以通过验证输入来修复错误,这是您无论如何都应该做的事情。
通过类型保护验证,以下类型检查正确
const DNATranscriber = {
G: 'C',
C: 'G',
T: 'A',
A: 'U'
};
export default class Transcriptor {
toRna(dna: string) {
const codons = [...dna];
if (!isValidSequence(codons)) {
throw Error('invalid sequence');
}
const transcribedRNA = codons.map(codon => DNATranscriber[codon]);
return transcribedRNA;
}
}
function isValidSequence(values: string[]): values is Array<keyof typeof DNATranscriber> {
return values.every(isValidCodon);
}
function isValidCodon(value: string): value is keyof typeof DNATranscriber {
return value in DNATranscriber;
}
值得一提的是,您似乎误解了将JavaScript转换为TypeScript涉及到使用类。
在接下来的更惯用的版本中,我们利用TypeScript来提高清晰度,并在不更改实现的情况下获得更强的碱基对映射类型。我们使用function
,就像原来的一样,因为它有意义。这事很重要!将JavaScript转换为TypeScript与类无关,它与静态类型有关。
const DNATranscriber = {
G: 'C',
C: 'G',
T: 'A',
A: 'U'
};
export default function toRna(dna: string) {
const codons = [...dna];
if (!isValidSequence(codons)) {
throw Error('invalid sequence');
}
const transcribedRNA = codons.map(codon => DNATranscriber[codon]);
return transcribedRNA;
}
function isValidSequence(values: string[]): values is Array<keyof typeof DNATranscriber> {
return values.every(isValidCodon);
}
function isValidCodon(value: string): value is keyof typeof DNATranscriber {
return value in DNATranscriber;
}
更新
从TypeScript 3.7开始,我们可以更有表现力地编写它,使用断言签名来形式化输入验证和其类型隐含之间的对应关系。
const DNATranscriber = {
G: 'C',
C: 'G',
T: 'A',
A: 'U'
} as const;
type DNACodon = keyof typeof DNATranscriber;
type RNACodon = typeof DNATranscriber[DNACodon];
export default function toRna(dna: string): RNACodon[] {
const codons = [...dna];
validateSequence(codons);
const transcribedRNA = codons.map(codon => DNATranscriber[codon]);
return transcribedRNA;
}
function validateSequence(values: string[]): asserts values is DNACodon[] {
if (!values.every(isValidCodon)) {
throw Error('invalid sequence');
}
}
function isValidCodon(value: string): value is DNACodon {
return value in DNATranscriber;
}
您可以在TypeScript 3.7 release notes中阅读有关断言签名的更多信息。
发布于 2019-07-25 09:02:23
此外,您还可以执行以下操作:
(this.DNATranscriber as any)[character];
编辑。
强烈建议您使用适当的类型而不是any
来强制转换对象。将对象转换为any
只能帮助您在编译typescript时避免类型错误,但这无助于保持代码的类型安全。
,例如
interface DNA {
G: "C",
C: "G",
T: "A",
A: "U"
}
然后你就像这样投射它:
(this.DNATranscriber as DNA)[character];
发布于 2020-08-10 22:19:57
这就是我为解决相关问题所做的事情
interface Map {
[key: string]: string | undefined
}
const HUMAN_MAP: Map = {
draft: "Draft",
}
export const human = (str: string) => HUMAN_MAP[str] || str
https://stackoverflow.com/questions/56568423
复制相似问题