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

Typescript 使用属性装饰器对属性类型进行严格的类型检查,typescript,decorator,web-component,Typescript,Decorator,Web Component,是否有方法验证在Typescript中修饰的属性的类型?我想要一个只适用于布尔类属性的属性装饰器,但不适用于例如字符串(下面的示例)。这可能吗 (注意:我不希望通过反射元数据进行运行时验证,只希望使用Typescript发出编译类型警告。) 函数布尔属性(目标:T,属性:字符串){ //'target'将是类的原型 反映。定义属性(目标、道具、{ 获取(this:T):布尔值{ 返回此.hasAttribute(prop); }, set(this:T,value:boolean):void{

是否有方法验证在Typescript中修饰的属性的类型?我想要一个只适用于
布尔
类属性的属性装饰器,但不适用于例如
字符串
(下面的示例)。这可能吗

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

函数布尔属性(目标:T,属性:字符串){
//'target'将是类的原型
反映。定义属性(目标、道具、{
获取(this:T):布尔值{
返回此.hasAttribute(prop);
},
set(this:T,value:boolean):void{
如果(值){
此.setAttribute(prop“”);
}否则{
此。删除属性(prop);
}
}
});
}
类MyElement扩展了HtmleElement{
@布尔性质
foo:布尔;
@布尔性质
bar:string;//TS编译错误
}
自定义元素。定义('my-element',MyElement);
这个怎么样

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

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

我还没有看过手册,但我记得还有第三个论点,你可以在那里定义一个泛型来界定它的范围。只是一种预感,希望对你有用。聪明!我没有想过用这种方式缩小
prop
参数的范围。不幸的是,这只适用于公共属性。使用受保护/私有属性也可以改进这种情况吗?实际上不可能以编程方式操作私有或受保护属性,因为它们是故意从类型函数(如
keyof
)中无法访问的。
function booleanProperty<
  T extends HTMLElement & Record<K, boolean>,
  K extends string>(target: T, prop: K) {
    // ... impl here
}
class MyElement extends HTMLElement {
  @booleanProperty // okay
  foo: boolean;

  @booleanProperty // error
  bar: string;
}