gpt4 book ai didi

typescript - 如何从 typescript 中的类型中排除 getter only 属性

转载 作者:搜寻专家 更新时间:2023-10-30 21:56:28 28 4
gpt4 key购买 nike

类中的 getter 是只读属性,因此从以下代码中抛出类型错误是有意义的。

class Car {
engine: number;
get hp() {
return this.engine / 2;
}
get kw() {
return this.engine * 2;
}
}

function applySnapshot(
car: Car,
snapshoot: Partial<Car> // <-- how to exclude readonly properties?
) {
for (const key in snapshoot) {
if (!snapshoot.hasOwnProperty(key)) continue;
car[key as keyof Car] = snapshoot[key as keyof Car];
// Cannot assign to 'hp' because it is a constant or a read-only property.
}
}

有没有办法将只写属性转换为类型并排除所有 getter?

example in playground

最佳答案

虽然 readonly 不直接影响类型是否可赋值,但会影响它们是否相同。为了测试两种类型是否相同,我们可以滥用 (1) 条件类型的可分配性规则,这要求 extends 之后的类型相同,或者 (2) 交集类型的推理过程,从双方抛出相同的类型。然后我们只需像 Titian Cernicova-Dragomir 的回答中那样使用映射类型依次查看 Car 的每个属性,看看它是否与自身的可变版本相同。

// https://github.com/Microsoft/TypeScript/issues/27024#issuecomment-421529650
type IfEquals<X, Y, A, B> =
(<T>() => T extends X ? 1 : 2) extends
(<T>() => T extends Y ? 1 : 2) ? A : B;

// Alternatively:
/*
type IfEquals<X, Y, A, B> =
[2] & [0, 1, X] extends [2] & [0, 1, Y] & [0, infer W, unknown]
? W extends 1 ? B : A
: B;
*/

type WritableKeysOf<T> = {
[P in keyof T]: IfEquals<{ [Q in P]: T[P] }, { -readonly [Q in P]: T[P] }, P, never>
}[keyof T];
type WritablePart<T> = Pick<T, WritableKeysOf<T>>;

class Car {
engine: number;
get hp() {
return this.engine / 2;
}
get kw() {
return this.engine * 2;
}
}

function applySnapshot(
car: Car,
snapshoot: Partial<WritablePart<Car>>
) {
let key: keyof typeof snapshoot;
for (key in snapshoot) {
if (!snapshoot.hasOwnProperty(key)) continue;
car[key] = snapshoot[key];
}
}

关于typescript - 如何从 typescript 中的类型中排除 getter only 属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54729487/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com