gpt4 book ai didi

typescript - 使用属性装饰器对属性类型进行严格类型检查

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

有没有办法验证在 Typescript 中修饰的属性的类型?我想要一个仅适用于 boolean 类属性的属性装饰器,但不适用于例如string(下面的示例)。这可能吗?

(注意:我不希望通过反射元数据进行运行时验证,只是使用 Typescript 的编译类型警告。)

function booleanProperty<T extends HTMLElement>(target: T, prop: string) {
// `target` will be the class' prototype
Reflect.defineProperty(target, prop, {
get(this: T): boolean {
return this.hasAttribute(prop);
},
set(this: T, value: boolean): void {
if (value) {
this.setAttribute(prop, '');
} else {
this.removeAttribute(prop);
}
}
});
}

class MyElement extends HTMLElement {
@booleanProperty
foo: boolean;

@booleanProperty
bar: string; // TS compile error
}
customElements.define('my-element', MyElement);

最佳答案

这个呢?

function booleanProperty<
T extends HTMLElement & Record<K, boolean>,
K extends string>(target: T, prop: K) {
// ... impl here
}

传入的 target 需要是一个 HTMLElement,它在键 K 处有一个 boolean 属性,其中 K 是传入的 prop 的类型。让我们看看它是否有效:

class MyElement extends HTMLElement {
@booleanProperty // okay
foo: boolean;

@booleanProperty // error
bar: string;
}

我觉得不错。这对你有用吗?

关于typescript - 使用属性装饰器对属性类型进行严格类型检查,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47425088/

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