如何循环遍历打字稿中的两个对象键?
How to loop through two object keys in typescript?
我制作了一个 Vector class,但语法有问题。
这是我的代码:
export class Vector {
x: number;
y: number;
constructor(x = 0, y = 0) {
this.x = x;
this.y = y;
}
add(v: Vector) {
var x: number, y: number;
for (var component in this) {
component == "x"
? (x = this[component] + v[component])
: (y = this[component] + v[component]);
}
return new Vector(x, y);
}
}
这是我遇到的语法问题:
如您所见,“return new Vector(x,y)”行中的“x”和“y”表示“变量 'x' 在分配前已使用”... “v[component]”表示“类型 'Extract<keyof this, string>' 不能用于索引类型 'Vector'”。
我不知道我做错了什么,代码可以工作,但我想正确地编写它。
但是,如果您打算在方法中使用循环,则需要缩小编译器的键类型:
您可以手动完成:
add (v: Vector): Vector {
const vec = new Vector();
for (const key in vec) {
type K = 'x' | 'y';
vec[key as K] = this[key as K] + v[key as K];
}
return vec;
}
或者对范围的其余部分使用 assertion function:
function assertType <T = unknown>(value: unknown): asserts value is T {}
add (v: Vector): Vector {
const vec = new Vector();
for (const key in vec) {
assertType<'x' | 'y'>(key);
vec[key] = this[key] + v[key];
}
return vec;
}
就我个人而言,这就是我的做法。
add(v: Vector): vector {
const res = new Vector();
Object.keys(this).forEach(component => {
res[component] = this[component] + v[component];
});
return res;
}
我拼凑了一个快速沙箱示例 here
我制作了一个 Vector class,但语法有问题。
这是我的代码:
export class Vector {
x: number;
y: number;
constructor(x = 0, y = 0) {
this.x = x;
this.y = y;
}
add(v: Vector) {
var x: number, y: number;
for (var component in this) {
component == "x"
? (x = this[component] + v[component])
: (y = this[component] + v[component]);
}
return new Vector(x, y);
}
}
这是我遇到的语法问题:
如您所见,“return new Vector(x,y)”行中的“x”和“y”表示“变量 'x' 在分配前已使用”... “v[component]”表示“类型 'Extract<keyof this, string>' 不能用于索引类型 'Vector'”。
我不知道我做错了什么,代码可以工作,但我想正确地编写它。
您可以手动完成:
add (v: Vector): Vector {
const vec = new Vector();
for (const key in vec) {
type K = 'x' | 'y';
vec[key as K] = this[key as K] + v[key as K];
}
return vec;
}
或者对范围的其余部分使用 assertion function:
function assertType <T = unknown>(value: unknown): asserts value is T {}
add (v: Vector): Vector {
const vec = new Vector();
for (const key in vec) {
assertType<'x' | 'y'>(key);
vec[key] = this[key] + v[key];
}
return vec;
}
就我个人而言,这就是我的做法。
add(v: Vector): vector {
const res = new Vector();
Object.keys(this).forEach(component => {
res[component] = this[component] + v[component];
});
return res;
}
我拼凑了一个快速沙箱示例 here