首页技术typescript面试题?vue面试题及答案100题

typescript面试题?vue面试题及答案100题

编程之家2026-06-071013次浏览

各位老铁们,大家好,今天由我来为大家分享typescript面试题,以及vue面试题及答案100题的相关问题知识,希望对大家有所帮助。如果可以帮助到大家,还望关注收藏下本站,您的支持是我们最大的动力,谢谢大家了哈,下面我们开始吧!

typescript面试题?vue面试题及答案100题

一道3 层的 typescript 面试题,你能答到第几层

一道 3层的 typescript面试题,你能答到第几层?

这道题有 3个层次,我们一层层来看。

第一层的要求是这样的:

实现一个 zip函数,对两个数组的元素按顺序两两合并,比如输入 [1,2,3], [4,5,6]时,返回 [[1,4], [2,5],[3,6]]

这层就是每次各从两个数组取一个元素,合并之后放到数组里,然后继续处理下一个,递归进行这个流程,直到数组为空即可。

functionzip(target, source){

typescript面试题?vue面试题及答案100题

if(!target.length||!source.length)return[];

const[one,...rest1]= target;

const[other,...rest2]= source;

return[[one, other],...zip(rest1, rest2)];}

结果是对的

也是直接 function声明函数类型和 interface声明函数类型然后加到变量类型上两种。

typescript面试题?vue面试题及答案100题

因为具体元素类型不知道,所以用 unknown。

这里可能会问 any和 unknown的区别:

any和 unknown都可以接收任何类型:

但是 any也可以赋值给任何类型,但 unknown不行。

这里只是用来接收其他类型,所以 unknown比any更合适一些,更安全。

这一层也是比较基础的 ts语法,第三层就上了难度了:

用类型编程实现精确的类型提示,比如参数传入 [1,2,3], [4,5,6],那返回值的类型要提示出 [[1,4], [2,5],[3,6]]

这里要求返回值类型是精确的,我们就要根据参数的类型来动态生成返回值类型。

也就是这样:

声明两个类型参数 Target、Source,约束为 unknown[],也就是元素类型任意的数组类型。

这俩类型参数分别是传入的两个参数的类型。

返回值通过 Zip计算得出。

然后要实现 Zip的高级类型:

传入的类型参数分别是两个数组类型,我们同样要从中提取出每个元素合并到一起。

提取元素可以用模式匹配的方式:

所以这个类型就可以这样定义:

typeZip<Oneextendsunknown[], Otherextendsunknown[]>=

Oneextends[infer OneFirst,...infer Rest1]

? Otherextends[infer OtherFirst,...infer Rest2]

? [[OneFirst, OtherFirst],...Zip<Rest1, Rest2>]

: []

: [];

分别提取两个数组的第一个元素,构造成新数组。然后对剩下的数组递归进行这样的处理,直到数组为空。

这样就实现了我们想要的高级类型:

但你把它作为返回值加到函数上会报错:

因为声明函数的时候都不知道参数是啥,自然计算不出 Zip<Target, Source>的值,所以这里会类型不匹配:

那怎么办呢?

可以用函数重载解决:

ts支持函数重载,可以写多个同名函数的类型的类型定义,最后写函数的实现,这样用到这个函数的时候会根据参数的类型来匹配函数类型。

我们用了类型编程的那个函数通过这种方式写就不会报错了。

我们使用下看看:

咋返回值的类型不对呢?

其实这时候匹配的函数类型是对的,只不过推导出的不是字面量类型。

这时候可以加个 as const。

但是加上 as const会推导出 readonly [1,2,3]

这样类型就不匹配了,所以要在类型参数的声明上也加上 readonly:

但这样 Zip函数的类型又不匹配了。

难道要把所有用到这个类型的地方都加上 readonly么?

不用,我们 readonly的修饰去掉不就行了?

Type有内置的高级类型 readonly:

可以把索引类型的每个索引都加上 readonly修饰:

但没有提供去掉 readonly修饰的高级类型,我们可以自己实现一下:

用映射类型的语法构造个新索引类型,加上个-readonly就是去掉 readonly修饰的意思。

有的同学可能问了,数组类型也是索引类型么?

是,索引类型是聚合多个元素的类型,所以对象、数组、class都是。

所以我们把它用在数组上自然也是可以的:

(准确来说叫元组,元组是元素个数固定的数组)

那我们只要在传入 Zip之前,用 Mutable去掉 readonly就可以了:

再来试一下:

大功告成!现在返回值的类型就对了。

但还有个问题,如果不是直接传入字面量,是推导不出字面量类型的,这时候貌似就不对了:

可我们不都声明重载类型了么?

如果推导不出字面量类型,应该匹配这个呀:

但实际上它匹配的还是第一个:

这时候其实只要调换下两个函数类型的顺序就可以了:

这时字面量参数的情况依然也是对的:

为什么呢?

因为重载函数的类型是从上到下依次匹配,只要匹配到一个就应用。

非字面量的情况,类型是 number[],能匹配 unknown[]的那个类型,所以那个函数类型生效了。

而字面量的情况,推导出的是 readonly [1,2,3],带有 readonly所以不匹配 unknown[],继续往下匹配,就匹配到了带有类型参数的那个函数类型。

这样两种情况就都应用了合适的函数类型。

全部代码是这样的:

typeZip<Oneextendsunknown[], Otherextendsunknown[]>= Oneextends[

infer OneFirst,

...infer Rest1

]

? Otherextends[infer OtherFirst,...infer Rest2]

? [[OneFirst, OtherFirst],...Zip<Rest1, Rest2>]

: []

: [];

typeMutable<Obj>={

-readonly [Keyinkeyof Obj]: Obj[Key];

};

functionzip(target: unknown[], source: unknown[]):unknown[];

functionzip<Targetextendsreadonlyunknown[],Sourceextendsreadonlyunknown[]>(

target: Target,

source: Source

):Zip<Mutable<Target>,Mutable<Source>>;

functionzip(target: unknown[], source: unknown[]){

if(!target.length||!source.length)return[];

const[one,...rest1]= target;

const[other,...rest2]= source;

return[[one, other],...zip(rest1, rest2)];

}

constresult= zip([1,2,3]asconst, [4,5,6]asconst);

constarr1= [1,2,3];

constarr2= [4,'5',6];

constresult2= zip(arr1, arr2);

今天我们做了一道综合的 ts面试题,一共有三层:

第一层实现 js的逻辑,用递归或者循环都能实现。

第二层给函数加上类型,用 function声明类型和 interface声明函数类型两种方式,参数和返回值都是 unknown[]。

第三层是用类型编程实现精准的类型提示,这一层需要拿到参数的类型,通过提取元素的类型并构造出新的数组类型返回。还要通过函数重载的方式来声明类型,并且要注意重载类型的声明顺序。

as const能够让字面量推导出字面量类型,但会带有 readonly修饰,可以自己写映射类型来去掉这个修饰。

其实这也是我们学习 ts的顺序,我们先要能把 js逻辑写出来,然后知道怎么给函数、class等加 ts类型,之后学习类型编程,知道怎么动态生成类型。

其中类型编程是 ts最难的部分,也是最强大的部分。攻克了这一层,ts就可以说学的差不多了。

常见Vite面试题

常见Vite面试题1. Vite是什么?答案:Vite是一个新一代的前端构建工具,由Vue.js的创始人Evan You开发。它旨在提供更快的开发体验,尤其是在现代前端项目中。Vite通过利用ES模块(ESM)和原生浏览器支持来实现快速的冷启动和热模块替换(HMR)。

2. Vite与传统构建工具(如Webpack)的区别是什么?答案:

开发速度:Vite在开发模式下使用原生ES模块,避免了传统构建工具在开发时打包整个应用的开销,因此启动速度更快。按需加载:Vite在开发模式下按需加载模块,而不是预先打包所有文件,减少了初始加载时间。构建速度:在生产模式下,Vite使用Rollup进行打包,优化了构建速度。HMR:Vite的热模块替换(HMR)速度更快,因为它直接更新浏览器中的模块,而不需要重新打包。3. Vite如何实现按需加载?答案:Vite在开发模式下利用浏览器的原生ES模块支持,按需加载模块。当浏览器请求某个模块时,Vite服务器会动态编译并返回该模块,而不是预先打包所有文件。这种方式减少了初始加载时间,提升了开发体验。

4. Vite中的环境变量是如何处理的?答案:Vite通过import.meta.env对象来访问环境变量。开发者可以在项目根目录下创建.env文件来定义环境变量,Vite会自动加载这些变量。例如,.env文件中的VITE_API_URL可以通过import.meta.env.VITE_API_URL访问。

5. Vite的生产构建是如何进行的?答案:在Vite的生产构建中,默认使用Rollup进行打包。Rollup会将所有模块打包成一个或多个优化后的文件,以便在生产环境中高效运行。Vite还提供了许多配置选项来优化生产构建,例如代码分割、tree-shaking等。

6. Vite的插件系统是如何工作的?答案:Vite的插件系统基于Rollup的插件API,开发者可以通过编写插件来扩展Vite的功能。Vite插件可以用于处理文件转换、优化构建、添加自定义功能等。Vite还提供了一些内置插件,例如@vitejs/plugin-vue用于支持Vue项目。

7. Vite如何优化开发体验?答案:

快速冷启动:通过利用原生ES模块,Vite避免了传统构建工具的打包开销,启动速度更快。按需加载:Vite在开发模式下按需加载模块,减少了初始加载时间。快速HMR:Vite的热模块替换(HMR)速度更快,因为它直接更新浏览器中的模块,而不需要重新打包。内置TypeScript支持:Vite内置了对TypeScript的支持,开发者可以直接使用TypeScript进行开发。8. Vite如何处理静态资源?答案:Vite通过原生ES模块支持、路径处理、资源优化和插件扩展等方式,为静态资源提供了高效且灵活的处理机制。例如,Vite可以自动处理图片、字体等静态资源的路径,并在生产构建中进行优化,如压缩、缓存等。此外,开发者还可以通过编写插件来扩展Vite对静态资源的处理能力。

2022最全WebGIS面试题分享

2022年WebGIS面试题汇总如下:

一、基础问题请做个自我介绍

需结合GIS开发经验,突出技术栈(如OpenLayers、Leaflet)、项目经历及解决实际问题的能力。

路由生命周期(导航守卫)

全局守卫:

beforeEach(to, from, next):路由跳转前触发。

beforeResolve(to, from, next):解析守卫,在所有组件内守卫和异步路由组件解析后触发。

afterEach(to, from):跳转完成后触发。

路由守卫:

beforeEnter(to, from, next):针对单个路由配置的守卫。

组件守卫:

beforeRouteEnter(to, from, next):进入组件前触发。

beforeRouteUpdate(to, from, next):路由更新时触发。

beforeRouteLeave(to, from, next):离开组件时触发。

二、技术栈与项目经验项目中使用哪些技术栈?

示例回答:

前端:jQuery+ Bootstrap或 Vue+ Vue-router+ Element-UI。

后端:Node.js+ Express连接MySQL数据库。

地图服务:OpenLayers加载天地图WMTS服务。

天地图的服务格式及加载方式

天地图采用OGC WMTS标准,通过OpenLayers的ol.source.WMTS或ol.source.XYZ加载。

ol.source.XYZ:需配置URL模板、坐标系(如EPSG:3857)。

ol.source.WMTS:需配置原点、分辨率数组、级别、坐标系等参数。

WMS与WMTS的区别

WMTS:返回固定大小的瓦片,支持缓存,响应快。

WMS:返回完整图片,无缓存,适合动态渲染。

其他OGC标准服务

WFS(要素服务)、WPS(地理处理服务)、WCS(栅格服务)。

天地图的坐标系

CGCS2000(中国2000国家大地坐标系)。

Web墨卡托投影与地理坐标系的区别

地理坐标系:三维(经纬度+大地高),如WGS84。

Web墨卡托投影:二维(XY坐标),形状为正方形,常用于Web地图。

常用坐标系分类

大地坐标系:三维(经纬度),如WGS84、CGCS2000。

投影坐标系:二维(XY),如Web墨卡托(EPSG:3857)。

三、JavaScript与前端开发为什么JS是单线程?

JS需操作DOM,多线程会导致冲突(如一个线程删除元素,另一个线程添加子元素)。

Web Worker提供多线程能力,但无法操作DOM。

JS单线程问题及解决方案

问题:同步任务阻塞页面,耗时任务(如网络请求)导致卡顿。

解决方案:

异步任务:通过消息队列和事件循环(Event Loop)处理。

执行顺序:同步任务→微任务(如Promise.then)→宏任务(如setTimeout)。

宏任务与微任务

宏任务:setTimeout、setInterval、I/O、UI渲染。

微任务:Promise.then、process.nextTick。

执行顺序:主线程→微任务队列→宏任务队列。

四、地图服务与优化如何发布自定义地图服务?

使用GeoServer(开源)或ArcGIS/SuperMap/MapGIS(商用)发布WMS/WMTS服务。

点图层加载优化

方法:

使用矢量切片(Vector Tiles)减少数据量。

启用聚类渲染(如OpenLayers的ol.source.Cluster)。

分级加载(根据缩放级别动态显示点)。

查询河周边污染工厂的实现思路

步骤:

使用空间查询(如PostGIS的ST_DWithin)筛选河流缓冲区内的工厂。

结合属性查询(如污染等级字段)过滤结果。

在前端通过OpenLayers高亮显示符合条件的工厂。

影像与矢量叠加实现

前端:使用ol.layer.Group组合影像图层(如XYZ源)和矢量图层(如GeoJSON源)。

后端:通过WMS服务叠加返回单一图片。

五、扩展问题是否了解Cesium?

Cesium是开源的3D地理可视化库,支持倾斜摄影、地形数据加载,常用于三维WebGIS开发。

是否熟悉Vue3和TypeScript?

Vue3的Composition API和TypeScript的静态类型检查可提升代码可维护性,建议结合OpenLayers使用。

数据库与SQL经验

常用数据库:PostgreSQL(PostGIS扩展)、MySQL、MongoDB。

示例SQL:

--查询河流缓冲区内的工厂SELECT* FROM factories WHERE ST_DWithin(geom,(SELECT geom FROM rivers WHERE name='某河'), 1000);浏览器适配经验

使用CSS媒体查询或Flex/Grid布局适配不同屏幕尺寸。

测试主流浏览器(Chrome、Firefox、Edge)的兼容性。

六、开放性问题项目中的亮点与挑战

亮点:如高性能瓦片加载、自定义空间分析工具开发。

挑战:如大数据量渲染卡顿,通过Web Worker或服务端渲染解决。

未来规划

短期:深入学习三维GIS(Cesium)或大数据可视化(Mapbox GL)。

长期:向全栈GIS开发或空间数据分析方向发展。

以上问题覆盖了WebGIS开发的核心知识点,建议结合实际项目经验准备具体案例,以提升面试通过率。

文章到此结束,如果本次分享的typescript面试题和vue面试题及答案100题的问题解决了您的问题,那么我们由衷的感到高兴!

红玉圣殿掉落 红玉圣殿小怪掉落英雄联盟更新 2026年英雄联盟5月更新