阅读 397

ts中any和unknown的区别

这是我参与8月更文挑战的第18天,活动详情查看:8月更文挑战

什么是unknown类型?

TypeScript 3.0 引入了一个新的 top type unknown。 unknown是 的类型安全对应物any。任何类型都可以分配给unknown,但unknown不能分配给任何数据,除了它本身,并且any没有类型断言或基于控制流的缩小。同样,如果unknown没有首先断言或缩小到更具体的类型,则不允许对一个unknown进行任何操作。

为什么在了解unknown?

是这样的,我在写着ui组件,参考各种ui组件源码,看到vant上有设置这么一个类型

export const unknownProp = (null as unknown) as PropType<unknown>;

inactiveValue: {
  type: unknownProp,
  default: false as unknown,
},
复制代码

还真的不太知道他这么做是什么意思,所以就各种网上找找相关资料

这是一个props,从父组件中传递进来的,我觉得吧,有可能传进来的各种类型值都有效,所以才会设置unknown,如果可以传入任何值,是不是大家都会使用any了呢?我们写ts,努力写出最好的类型,但是为了,有可能部门里面的人对ts的了解都不太统一,一些不熟的组员可能就会因为去解决一些ts报错而选择了使用any,但是我觉得使用any类型违背了 TypeScript 的目的,确实如此。还有其他一些类型值得了解,我们可能会发现它们在尝试不使用 any 时很有用,比如 unknown 。

any

有时候,我们会想要为那些在编程阶段还不清楚类型的变量指定一个类型。 这些值可能来自于动态的内容,比如来自用户输入或第三方代码库。 这种情况下,我们不希望类型检查器对这些值进行检查而是直接让它们通过编译阶段的检查。 那么我们可以使用any类型来标记这些变量:

let notSure: any = 4;
notSure = "maybe a string instead";
notSure = false; // okay, definitely a boolean
复制代码

通过使用 any,我们破坏了 TypeScript 的能力引起了一些麻烦。没有强制的类型检查,可能会给您带来一些麻烦。

const dataMethod: any = 'Hello world!';
dataMethod.hello();
复制代码

怎么用

TypeScript 3.0中引入的 unknown类型也被认为是最高类型,但它更安全

let dataMethod: unknown = 'Hello'!;
dataMethod = 12;
dataMethod = { hello: () => 'Hello!' };

复制代码

我们只能将 unknown 类型的变量赋值给 anyunknown

let data: unknown = 'Hello'!;
let data2: any = data;
复制代码

虽然都可以赋值给unknown,但是需要对unknown进行缩小类型,否则无法执行任何操作,TypeScript 不允许我们对类型为 unknown 的值执行任意操作

function dateMethod() {
 return '22'
}

const data: unknown = dateMethod();
data.hello(); // ts报错: Object is of type 'unknown'.ts(2571)
复制代码

可以使用断言缩小未知范围,就像上面vant源码的操作,强制ts编译器相信我们自己在做什么。

或者可以用instanceof来缩小变量的类型

type getPeople = () => unknown;
const man = getPeople();
if (man instanceof People) {
 console.log(man.name.toLowerCase());
}
复制代码

我们确保只有在变量是某个原型的实例时才调用

文章分类
前端
文章标签