$cache[$key] = empty($arr) ? NULL : $arr; return $cache[$key]; } // 门户 获取需要在频道显示的栏目主题数据 function portal_channel_thread($fid) { global $forumlist; if (empty($fid)) return NULL; $orderby = array('tid' => 1); $page = 1; // 遍历所有在频道显示内容的栏目 $category_forumlist = channel_category($fid); $arrlist = array(); $forum_tids = array(); $tidlist = array(); if ($category_forumlist) { foreach ($category_forumlist as &$_forum) { // 频道显示数据 $arrlist['list'][$_forum['fid']] = array( 'fid' => $_forum['fid'], 'name' => $_forum['name'], 'rank' => $_forum['rank'], 'type' => $_forum['type'], 'url' => $_forum['url'], 'channel_new' => $_forum['channel_new'], ); $forum_thread = thread_tid__find(array('fid' => $_forum['fid']), $orderby, $page, $_forum['channel_new'], 'tid', array('tid')); // 最新信息按栏目分组 foreach ($forum_thread as $key => $_thread) { $forum_tids[$key] = $_thread; } unset($forum_thread); } $tidlist += $forum_tids; } unset($category_forumlist); // 获取属性对应的tid集合 list($flaglist, $flagtids) = flag_thread_by_fid($fid); empty($flagtids) || $tidlist += $flagtids; unset($flagtids); // 频道置顶 $stickylist = sticky_list_thread($fid); empty($stickylist) || $tidlist += $stickylist; // 在这之前合并所有二维数组 tid值为键/array('tid值' => tid值) $tidarr = arrlist_values($tidlist, 'tid'); // 在这之前使用$tidarr = array_merge($tidarr, $arr)前合并所有一维数组 tid/array(1,2,3) if (empty($tidarr)) { $arrlist['list'] = isset($arrlist['list']) ? array_multisort_key($arrlist['list'], 'rank', FALSE, 'fid') : array(); return $arrlist; } $tidarr = array_unique($tidarr); $pagesize = count($tidarr); // 遍历获取的所有tid主题 $threadlist = well_thread_find_asc($tidarr, $pagesize); // 遍历时为升序,翻转为降序 $threadlist = array_reverse($threadlist); foreach ($threadlist as &$_thread) { // 各栏目最新内容 isset($forum_tids[$_thread['tid']]) AND $arrlist['list'][$_thread['fid']]['news'][$_thread['tid']] = $_thread; // 全站置顶内容 isset($stickylist[$_thread['tid']]) AND $arrlist['sticky'][$_thread['tid']] = $_thread; // 首页属性主题 if (!empty($flaglist)) { foreach ($flaglist as $key => $val) { if (isset($val['tids']) && in_array($_thread['tid'], $val['tids'])) { $arrlist['flaglist'][$key][array_search($_thread['tid'], $val['tids'])] = $_thread; ksort($arrlist['flaglist'][$key]); $arrlist['flag'][$_thread['tid']] = $_thread; } } } } unset($threadlist); if (isset($arrlist['sticky'])) { $i = 0; foreach ($arrlist['sticky'] as &$val) { ++$i; $val['i'] = $i; } } if (isset($arrlist['flag'])) { $i = 0; foreach ($arrlist['flag'] as &$val) { ++$i; $val['i'] = $i; } } if (isset($arrlist['flaglist'])) { foreach ($arrlist['flaglist'] as &$val) { $i = 0; foreach ($val as &$v) { ++$i; $v['i'] = $i; } } } isset($arrlist['list']) AND $arrlist['list'] = array_multisort_key($arrlist['list'], 'rank', FALSE, 'fid'); return $arrlist; } ?>javascript - Typescript Hoisting - Stack Overflow
最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

javascript - Typescript Hoisting - Stack Overflow

programmeradmin0浏览0评论

I am trying to understand hoisting in typescript. Does hoisting take place in Typescript and if yes, is there any difference compared to how it happens in Javascript.

eg: The code transpiles fine even though I declared interface after the function that is using it. Is it safe to assume it happens due to hoisting as a part of transpilation or else there is something else involved here.

getCarDetails({name: 'Xyz', topSpeed: 300})

function getCarDetails(carDetails: CarDetails) {

  console.log(carDetails.name);

  console.log(carDetails.topSpeed);

}

interface CarDetails {

  name: string;

  topSpeed: number;

}

I am trying to understand hoisting in typescript. Does hoisting take place in Typescript and if yes, is there any difference compared to how it happens in Javascript.

eg: The code transpiles fine even though I declared interface after the function that is using it. Is it safe to assume it happens due to hoisting as a part of transpilation or else there is something else involved here.

getCarDetails({name: 'Xyz', topSpeed: 300})

function getCarDetails(carDetails: CarDetails) {

  console.log(carDetails.name);

  console.log(carDetails.topSpeed);

}

interface CarDetails {

  name: string;

  topSpeed: number;

}
Share Improve this question asked Apr 19, 2021 at 9:36 atishatish 5855 silver badges20 bronze badges 2
  • @VLAZ: could you reflect once on the answer provided below, where it is mentioned "Hoisting does take place in TS" – atish Commented Apr 19, 2021 at 9:47
  • 2 Depends on your interpretation. I think Quentin means that code written in TS will still exhibit the same hoisting behaviour as if it's written in JS. Which is correct. I'm viewing it from another angle - does TS hoist your code. In which case the answer is "no" because, to quote Quentin: "TS is just JS with bits added." It doesn't actually run your code. Therefore, it's not TS that hoists it - it's the runtime environment. Both are valid interpretations, depending on what you mean by your question. At the core of it all is understanding what TS does. – VLAZ Commented Apr 19, 2021 at 9:51
Add a comment  | 

3 Answers 3

Reset to default 12

Does hoisting take place in Typescript

If your question is "Does TypeScript cause hoisting behaviour of the code?" then the answer is "No, it does not".

TypeScript does not exist at runtime, only at compile time. While "hoisting" is a concept related to running JavaScript code. TypeScript has as much of an impact on that as Notepad++ - whether you actually write your code there or not. That is to say, it has no influence over hoisting. It is the JavaScript engine that does it when it executes the code. Which is (potentially) far after the TypeScript compiler has finished with it.

However, if the question is "Does code written in TypeScript still exhibit hoisting behaviour?", the answer is "Yes, it does, but not in any way related to the fact that it is written in TypeScript". It would exhibit the same behaviour whether or not TypeScript is there.

The code transpiles fine even though I declared interface after the function that is using it. Is it safe to assume it happens due to hoisting as a part of transpilation or else there is something else involved here.

To be clear with terminology - "hoisting" refers to declarations being processed before running the code. This JavaScript code works due to hoisting:

fn();
function fn() {};

This TypeScript code does not use hoisting*:

const x: Foo = {id: 1};

interface Foo {
  id: number;
}

The type system only exists at compile time. Any TypeScript constructs like interfaces will be removed after compilation. Since they do not exist in JavaScript, it is an arbitrary and useless restriction to mandate interfaces be defined prior to using them.

The TypeScript code in the question compiles to the following JavaScript code:

getCarDetails({ name: 'Xyz', topSpeed: 300 });
function getCarDetails(carDetails) {
    console.log(carDetails.name);
    console.log(carDetails.topSpeed);
}

Thus only getCarDetails() will be hoisted when the code runs.


* const declarations are hoisted in JavaScript. This is the behaviour that leads to the temporal dead zone. This is just for the sake of completeness - it is not relevant in the given example.

YES, TypeScript support hoisting

just a small proof:

interface Circle {
    kind: ShapeKind.Circle;
    radius: number;
}
   
interface Square {
    kind: ShapeKind.Square;
    sideLength: number;
}

enum ShapeKind {
    Circle,
    Square,
}

Does hoisting take place in Typescript and if yes,

Yes. TS is just JS with bits added.

is there any difference compared to how it happens in Javascript.

No.

The code transpiles fine even though I declared interface after the function that is using it. Is it safe to assume it happens due to hoisting as a part of transpilation or else there is something else involved here.

Interfaces are only used for type checking, which only happens in the TypeScript (i.e. at build time and in linting tools). JavaScript doesn't support interfaces so they will be discarded during the transpiling process.

发布评论

评论列表(0)

  1. 暂无评论