type ClassFieldDecorator = (
value: undefined,
context: {
kind: 'field';
name: string | symbol;
static: boolean;
private: boolean;
access: { get: () => unknown, set: (value: unknown) => void };
addInitializer(initializer: () => void): void;
}
) => (initialValue: unknown) => unknown | void;
特点:
/**
* 属性装饰器要么不返回值,要么返回一个函数,
* 该函数会自动执行,用来对所装饰属性进行初始化。
* 该函数的参数是所装饰属性的初始值,
* 该函数的返回值是该属性的最终值
*/
class FieldDecorator {
@setField()
name: string = "88";
}
function setField() {
return function (value: undefined, context: ClassFieldDecoratorContext) {
return function (initialLetter: string) {
console.log(initialLetter, "initialLetter"); //88 initialLetter
return "7777";
};
};
}
let fieldIns = new FieldDecorator();
console.log(fieldIns.name, "fieldIns.name"); // 7777 fieldIns.name
对赋值进行重写:
class FieldDecorator {
@countNum
num: number = 333;
}
function countNum(value: undefined, context: ClassFieldDecoratorContext) {
return (initValue: number) => initValue * 2;
}
console.log(fieldIns.num); //666
属性装饰器中的 access:{ get: () => unknown, set: (value: unknown) => void };
let acc: any;
function countNum(value: undefined, context: ClassFieldDecoratorContext) {
acc = context.access;
return (initValue: number) => initValue * 2;
}
let fieldIns = new FieldDecorator();
console.log(acc.get(fieldIns));//666
acc.set(fieldIns,999)//999
tips: undefined 和 null 可以赋值为任何类型,以下可以运行。
type ClassFieldDecorator = () => () => string; /** function */
let c: ClassFieldDecorator = () => null || undefined;
TypeScript 的类型系统 - TypeScript 教程 - 网道
undefined
和null
既是值,又是类型。
作为值,它们有一个特殊的地方:任何其他类型的变量都可以赋值为undefined
或null
。
这并不是因为undefined
和null
包含在number
类型里面,而是故意这样设计,
任何类型的变量都可以赋值为undefined
和null
,以便跟 JavaScript 的行为保持一致。
JavaScript 的行为是,变量如果等于undefined
就表示还没有赋值,
如果等于null
就表示值为空。所以,TypeScript 就允许了任何类型的变量都可以赋值为这两个值。
为了避免这种情况,及早发现错误,TypeScript 提供了一个编译选项strictNullChecks
。只要打开这个选项,undefined
和null
就不能赋值给其他类型的变量(除了any
类型和unknown
类型)。
解决方式:
"strict": true, or "strictNullChecks": true,