【发布时间】:2019-01-05 06:20:00
【问题描述】:
TypeScript 3.0 引入了一种名为
unknown的新类型,它正是这样做的。很像any,任何值都可以分配给unknown;但是,与any不同,您不能访问类型为unknown的值的任何属性,也不能调用/构造它们。此外,unknown类型的值只能分配给unknown或any。例如,将上面的示例替换为使用
unknown而不是any会强制将所有对 foo 的使用变为错误:
let foo: unknown = 10;
// Since `foo` has type `unknown`, TypeScript
// errors on each of these usages.
foo.x.prop;
foo.y.prop;
foo.z.prop;
foo();
new foo();
upperCase(foo);
foo `hello world!`;
function upperCase(x: string) {
return x.toUpperCase();
}
我最近开始使用 TypeScript 进行编码,这是我的问题:
1。在我看来,unknown 可以完全替代any。
当然,用原生 JavaScript 编写的代码需要在 TypeScript 中自动使用 any 类型,但是当我们从头开始使用纯 TypeScript 编写代码时,是否有任何理由使用 any 类型而不是 unknown从 3.0 版开始?
2。 unknown 和 generics 有什么区别?
例如,
const A = <T>(value: T): T => value;
const A1 = (value: unknown) => value;
console.log(A<string>('Hello'), A<number>(100));
const B = <T, U>(t: T, u: U) => {
console.log(t);
console.log(u);
};
const B1 = (t: unknown, u: unknown) => {
console.log(t);
console.log(u);
};
B<string, number>('Hello', 100);
B<number, string>(100, 'Hello');
并假设参数value: unknown 最初是明确类型的,值的类型已确定,所以在我看来没有理由明确传递T。
谢谢。
【问题讨论】:
标签: typescript generics