下面代码是合法的: let a: unknown;const b: unknown = a;const c: any = a; 因为 let a: unknown;// ?Type 'unknown' is not assignable to type 'number'.ts(2322)const b: number = a; 但是如果使用时,明确知道了类型,则可以这样来修正: let a: unknown;// ?Type 'unknown' is not assignable to type 'number'.ts(2322)const b: number = a; 或者在条件语句中,已经可以明确推断出类型: let a: unknown;let b: number = 所以在使用时, 优先级与正交类型的搭配正交类型(intersection type)中, type T00 = unknown & null; // nulltype T01 = unknown & undefined; // undefinedtype T02 = unknown & null & undefined; // null & undefined (which becomes never)type T03 = unknown & string; // stringtype T04 = unknown & string[]; // string[]type T05 = unknown & unknown; // unknowntype T06 = unknown & any; // any 与联合类型的搭配联合类型(union type)中 type T10 = unknown | null; // unknowntype T11 = unknown | undefined; // unknowntype T12 = unknown | null | undefined; // unknowntype T13 = unknown | string; // unknowntype T14 = unknown | string[]; // unknowntype T15 = unknown | unknown; // unknowntype T16 = unknown | any; // any 上面仅一个例外,及和 使用在条件类型中条件类型(conditional type)中, type T30 对于上面的条件类型,进行以下测试: // `unknown` 不能赋值给 `number`type foo = T30 可进行的操作只能进行等于的判断,其他操作则会报错。 function f10(x: unknown) { x == 5; x !== 10; x >= 0; // Error x + 1; // Error x * 2; // Error -x; // Error +x; // Error} 属性字段获取,方法调用等,也是不允许的: function f11(x: unknown) { x.foo; // Error x[5]; // Error x(); // Error new x(); // Error} 当解构中有 function f26(x: {}, y: unknown, z: any) { let o1 = { a: 42, ...x }; // { a: number } let o2 = { a: 42, ...x, ...y }; // unknown let o3 = { a: 42, ...x, ...y, ...z }; // any} 具体使用场景
function prettyPrint(x: unknown): string { if (Array.isArray(x)) { return "[" + x.map(prettyPrint).join(", ") + "]" } if (typeof x === "string") { return `"${ x}"` } if (typeof x === "number") { return String(x) } return "etc."} 相关资源 |