Skip to content

Commit

Permalink
second edition post
Browse files Browse the repository at this point in the history
  • Loading branch information
danvk committed May 21, 2024
1 parent 639befa commit ccc1b7b
Show file tree
Hide file tree
Showing 6 changed files with 278 additions and 71 deletions.
187 changes: 187 additions & 0 deletions 2024/05/21/second-edition/index.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,187 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">

<title>Now Available: Effective TypeScript, Second Edition</title>
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<link href="/css/bootstrap.min.css" rel="stylesheet">
<link href="https://fonts.googleapis.com/css2?family=Khula:wght@600&family=Open+Sans:ital,wght@0,300;0,400;0,600;1,300;1,400;1,600&display=swap" rel="stylesheet">
<link href="/css/customize.css" rel="stylesheet">
<link href="/css/highlight.vs.css" rel="stylesheet">
<link rel="icon" type="image/png" href="/images/icon.png">
<meta name="description" content="Effective TypeScript: Now Available: Effective TypeScript, Second Edition">
<meta name="twitter:card" content="summary">
<meta name="twitter:creator" content="@danvdk">
<meta name="twitter:domain" content="effectivetypescript.com">
<meta name="twitter:title" content="Effective TypeScript &rsaquo; Now Available: Effective TypeScript, Second Edition">
<meta name="twitter:description" content="Fully updated, thoroughly revised, now with 50% more book!">
<meta name="twitter:img:src" content="https://effectivetypescript.com/images/cover-2e.jpg">

<meta property="og:title" content="Effective TypeScript &rsaquo; Now Available: Effective TypeScript, Second Edition">
<meta property="og:description" content="Fully updated, thoroughly revised, now with 50% more book!">
<meta property="og:image" content="https://effectivetypescript.com/images/cover-2e.jpg">
<meta property="og:url" content="https://effectivetypescript.com/">

<link href="https://effectivetypescript.com/atom.xml" type="application/atom+xml" rel="alternate" title="Effective TypeScript Atom Feed">
<meta name="generator" content="Hexo 5.4.0"></head>

<!-- Google tag (gtag.js) -->
<script async src="https://www.googletagmanager.com/gtag/js?id=G-1NXE8EL9YT"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());

gtag('config', 'G-1NXE8EL9YT');
var trackOutboundLink = function(category, url, e) {
if (!window.google_tag_manager) {
console.log('blocked!');
return true; // probably blocked
}

// No need to use event_callback if the link is opening in a new tab.
var newTab = e && (e.metaKey || (e.currentTarget && e.currentTarget.target === '_blank'));
gtag('event', 'click', {
'event_category': category,
'event_label': url,
'transport_type': 'beacon',
'event_callback': !newTab ? function() {
document.location = url;
} : undefined
});

return newTab;
}
</script>

<body class="post">
<div class="header">
<div class="container">
<div class="row">
<div class="col-md-12">
<h1 class="site-title">
<a href="/">
Effective TypeScript
</a>
</h1>
</div>
</div>
</div>
</div>

<section id="content" class="article content">

<div class="title-bar">
<div class="container">
<div class="row">
<div class="col-md-12">
<h2>Now Available: Effective TypeScript, Second Edition</h2>
</div>
</div>
</div>
</div>

<div class="page-content">
<div class="container">
<div class="row">
<div class="col-md-12">
<div class="text-muted published-container">
<time class="published" datetime="2024-05-21T21:30:00.000Z" itemprop="datePublished">
Tue 21 May 2024
</time>
</div>
<div class="entry-content">
<p><img src="https://effectivetypescript.com/images/cover-2e.jpg" style="float: right">I&#39;m happy to <a target="_blank" rel="noopener" href="https://twitter.com/danvdk/status/1788579805643915424" onclick="return trackOutboundLink('now available effective typescript second edition', 'https://twitter.com/danvdk/status/1788579805643915424', event);">announce</a> that the second edition of <a target="_blank" rel="noopener" href="https://amzn.to/3UjPrsK" onclick="return trackOutboundLink('now available effective typescript second edition', 'https://amzn.to/3UjPrsK', event);"><em>Effective TypeScript</em></a> is now available! I&#39;ve spent a good chunk of the past year working on this update, and I&#39;m incredibly happy with how it&#39;s turned out.</p>
<p>You can buy a copy at all the usual places:</p>
<ul>
<li><a target="_blank" rel="noopener" href="https://amzn.to/3UjPrsK" onclick="return trackOutboundLink('now available effective typescript second edition', 'https://amzn.to/3UjPrsK', event);">Amazon</a></li>
<li><a target="_blank" rel="noopener" href="https://www.amazon.com/Effective-TypeScript-Dan-Vanderkam-ebook/dp/B0D2SGRTGR/" onclick="return trackOutboundLink('now available effective typescript second edition', 'https://www.amazon.com/Effective-TypeScript-Dan-Vanderkam-ebook/dp/B0D2SGRTGR/', event);">Amazon eBook</a> (Kindle)</li>
<li><a target="_blank" rel="noopener" href="https://www.ebooks.com/en-us/book/211331398/effective-typescript/dan-vanderkam/" onclick="return trackOutboundLink('now available effective typescript second edition', 'https://www.ebooks.com/en-us/book/211331398/effective-typescript/dan-vanderkam/', event);">DRM-free eBook</a> (ebooks.com)</li>
<li><a target="_blank" rel="noopener" href="https://www.oreilly.com/library/view/effective-typescript/9781098155056/" onclick="return trackOutboundLink('now available effective typescript second edition', 'https://www.oreilly.com/library/view/effective-typescript/9781098155056/', event);">Read online</a> (O&#39;Reilly)</li>
</ul>
<p>If you&#39;d like to read it online, you can get a free month of access to the O&#39;Reilly online platform using promo code <a target="_blank" rel="noopener" href="https://learning.oreilly.com/get-learning/?code=ETYPESCRIPT24" onclick="return trackOutboundLink('now available effective typescript second edition', 'https://learning.oreilly.com/get-learning/?code=ETYPESCRIPT24', event);">ETYPESCRIPT24</a> (valid until the end of 2024).</p>
<p>The book has been thoroughly revised and expanded to reflect how TypeScript is used in 2024. You can find full <a target="_blank" rel="noopener" href="https://github.com/danvk/effective-typescript/releases/tag/2.0.0" onclick="return trackOutboundLink('now available effective typescript second edition', 'https://github.com/danvk/effective-typescript/releases/tag/2.0.0', event);">release notes</a> on the book&#39;s GitHub page, but here are the highlights:</p>
<ul>
<li>Two new chapters: one on Generics and Type-Level Programming and one on TypeScript Recipes</li>
<li>24 new items (one item from the first edition was dropped)</li>
<li>Coverage of new TypeScript features like template literal types and recursive type aliases.</li>
</ul>
<p>TypeScript has changed and grown since 2019 and so has <em>Effective TypeScript</em>: it&#39;s 50% thicker!</p>
<img src="/images/ets-1v2.jpg">

<p>If you enjoyed the first edition or use it as a reference, you&#39;ll be happy to update to the second. If you haven&#39;t read it yet, now&#39;s the perfect time to <a target="_blank" rel="noopener" href="https://amzn.to/3UjPrsK" onclick="return trackOutboundLink('now available effective typescript second edition', 'https://amzn.to/3UjPrsK', event);">pick up a copy</a>.</p>
<p>If you&#39;d like me to come give a talk at your company, please <a href="mailto:[email protected]">get in touch</a>. For a preview, check out the talk I gave at <a href="https://effectivetypescript.com/2024/01/31/etsy/">Etsy</a> in 2020.</p>

</div>
</div>
</div>
</div>
</div>

<div class="follow-or-subscribe">
<div class="container">
<div class="row">
<div class="col-md-12">
Like this post? Consider subscribing to
<a href="/mail/" onclick="return trackOutboundLink('subscribe newsletter', '/mail/', event);">my newsletter</a>,
the <a href="/atom.xml" onclick="return trackOutboundLink('follow RSS', '/atom.xml', event);">RSS feed</a>,
or <a target="_blank" rel="noopener" href="https://twitter.com/danvdk" onclick="return trackOutboundLink('follow on twitter', 'https://twitter.com/danvdk', event);">following me</a>
on Twitter.
</div>
</div>
</div>
</div>

<div class="comments">
<div class="container">
<div class="row">
<div class="col-md-12">
<script src="https://utteranc.es/client.js" repo="danvk/effective-typescript" issue-term="title" label="💬 blog comments" theme="github-light" crossorigin="anonymous" async>
</script>
</div>
</div>
</div>
</div>

<div class="promotion">
<div class="row">
<div class="col-sm-12 text-center">
<a target="_blank" rel="noopener" href="https://amzn.to/3UjPrsK" class="btn btn-info btn-lg primary" onclick="return trackOutboundLink('buy2e', 'https://amzn.to/3UjPrsK', event);">Buy 2nd Edition</a>
<!--
<a target="_blank" rel="noopener" href="https://amzn.to/3HIrQN6" data-tag="post learn more hover" class="btn btn-info btn-lg primary">Buy the Book</a>
<a target="_blank" rel="noopener" href="https://www.ebooks.com/en-us/209820951/effective-typescript/dan-vanderkam/?_c=1" data-tag="post learn more hover" class="btn btn-info btn-lg hidden-xs">Buy eBook</a>
https://amzn.to/3UjPrsK
-->
<a href="/mail/" class="btn btn-info btn-lg" onclick="return trackOutboundLink('post learn more hover', '/mail/', event);">Subscribe</a>
</div>
</div>
</div>

<div class="page-content">
<div class="container">
<div class="row">
<div class="col-md-12">
<a target="_blank" rel="noopener" href="https://amzn.to/3HIrQN6" onclick="return trackOutboundLink('post learn more cover image', 'https://amzn.to/3HIrQN6', event);">
<img src="/images/cover-2e.jpg" class="learn-more-photo" alt="Effective TypeScript Book Cover">
</a>
<p><strong><em>Effective TypeScript</em></strong> shows you not just <em>how</em> to use TypeScript but how to use it <em>well</em>. The book&#39;s 62 items help you build mental models of how TypeScript and its ecosystem work, make you aware of pitfalls and traps to avoid, and guide you toward using TypeScript’s many capabilities in the most effective ways possible. Regardless of your level of TypeScript experience, you can learn something from this book.</p>
<p>After reading <em>Effective TypeScript</em>, your relationship with the type system will be the most productive it&#39;s ever been! <a href="/">Learn more »</a></p>

</div>
</div>
</div>
</div>

</section>

<footer id="contentinfo" class="footer">
<div class="container">
<address id="about" class="vcard body">
&copy; 2019 - 2024 <a class="url fn" target="_blank" rel="noopener" href="https://danvk.org" onclick="trackOutboundLink('footer', 'https://danvk.org'); return false;">Dan Vanderkam</a>
<div class="footer-attribution">Powered by <a href="https://hexo.io/" target="_blank" onclick="return trackOutboundLink('now available effective typescript second edition', 'https://hexo.io/', event);">Hexo</a></div>
</address>
</div>
</footer>
</body>
</html>
9 changes: 9 additions & 0 deletions all-posts/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,15 @@ <h4>2024</h4>
</div>
</div>

<div class="row all-posts-post">
<div class="col-sm-2">
2024-05-21
</div>
<div class="col-sm-10">
<a href="/2024/05/21/second-edition/">Now Available: Effective TypeScript, Second Edition</a>
</div>
</div>

<div class="row all-posts-post">
<div class="col-sm-2">
2024-04-16
Expand Down
53 changes: 31 additions & 22 deletions archives/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -146,6 +146,28 @@ <h2>Recent Blog Posts</h2>

<div class="container">

<div class="row hentry" id="second-edition">
<div class="col-md-12">
<h3 class="entry-title">
<a href="/2024/05/21/second-edition/">Now Available: Effective TypeScript, Second Edition</a>
</h3>

<div class="text-muted published-container">
<time class="published" datetime="2024-05-21T21:30:00.000Z" itemprop="datePublished">
Tue 21 May 2024
</time>
</div>

<div class="entry-content">

Fully updated, thoroughly revised, now with 50% more book!
<a class="read-more" href="/2024/05/21/second-edition/">Continue&nbsp;reading&nbsp;&raquo;</a>

</div>
</div>
</div>


<div class="row hentry" id="inferring-a-type-predicate">
<div class="col-md-12">
<h3 class="entry-title">
Expand Down Expand Up @@ -355,28 +377,6 @@ <h3 class="entry-title">
</div>


<div class="row hentry" id="knip">
<div class="col-md-12">
<h3 class="entry-title">
<a href="/2023/07/29/knip/">Recommendation Update: ✂️ Use knip to detect dead code and types</a>
</h3>

<div class="text-muted published-container">
<time class="published" datetime="2023-07-29T14:20:00.000Z" itemprop="datePublished">
Sat 29 July 2023
</time>
</div>

<div class="entry-content">

<p>TL;DR: Use <a target="_blank" rel="noopener" href="https://github.com/nadeesha/ts-prune" onclick="return trackOutboundLink('recent blog posts', 'https://github.com/nadeesha/ts-prune', event);">ts-prune</a> is in maintenance mode. Use <a target="_blank" rel="noopener" href="https://github.com/webpro/knip" onclick="return trackOutboundLink('recent blog posts', 'https://github.com/webpro/knip', event);">knip</a> to find dead code instead. It&#39;s great!</p>
<a class="read-more" href="/2023/07/29/knip/">Continue&nbsp;reading&nbsp;&raquo;</a>

</div>
</div>
</div>



<div class="row">
<div class="col-md-12">
Expand All @@ -385,6 +385,15 @@ <h3>Older Posts</h3>
</div>


<div class="row">
<div class="col-sm-2">
2023-07-29
</div>
<div class="col-sm-10">
<a href="/2023/07/29/knip/">Recommendation Update: ✂️ Use knip to detect dead code and types</a>
</div>
</div>

<div class="row">
<div class="col-sm-2">
2023-06-27
Expand Down
47 changes: 20 additions & 27 deletions atom.xml

Large diffs are not rendered by default.

Binary file added images/ets-1v2.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
53 changes: 31 additions & 22 deletions index.html
Original file line number Diff line number Diff line change
Expand Up @@ -146,6 +146,28 @@ <h2>Recent Blog Posts</h2>

<div class="container">

<div class="row hentry" id="second-edition">
<div class="col-md-12">
<h3 class="entry-title">
<a href="/2024/05/21/second-edition/">Now Available: Effective TypeScript, Second Edition</a>
</h3>

<div class="text-muted published-container">
<time class="published" datetime="2024-05-21T21:30:00.000Z" itemprop="datePublished">
Tue 21 May 2024
</time>
</div>

<div class="entry-content">

Fully updated, thoroughly revised, now with 50% more book!
<a class="read-more" href="/2024/05/21/second-edition/">Continue&nbsp;reading&nbsp;&raquo;</a>

</div>
</div>
</div>


<div class="row hentry" id="inferring-a-type-predicate">
<div class="col-md-12">
<h3 class="entry-title">
Expand Down Expand Up @@ -355,28 +377,6 @@ <h3 class="entry-title">
</div>


<div class="row hentry" id="knip">
<div class="col-md-12">
<h3 class="entry-title">
<a href="/2023/07/29/knip/">Recommendation Update: ✂️ Use knip to detect dead code and types</a>
</h3>

<div class="text-muted published-container">
<time class="published" datetime="2023-07-29T14:20:00.000Z" itemprop="datePublished">
Sat 29 July 2023
</time>
</div>

<div class="entry-content">

<p>TL;DR: Use <a target="_blank" rel="noopener" href="https://github.com/nadeesha/ts-prune" onclick="return trackOutboundLink('recent blog posts', 'https://github.com/nadeesha/ts-prune', event);">ts-prune</a> is in maintenance mode. Use <a target="_blank" rel="noopener" href="https://github.com/webpro/knip" onclick="return trackOutboundLink('recent blog posts', 'https://github.com/webpro/knip', event);">knip</a> to find dead code instead. It&#39;s great!</p>
<a class="read-more" href="/2023/07/29/knip/">Continue&nbsp;reading&nbsp;&raquo;</a>

</div>
</div>
</div>



<div class="row">
<div class="col-md-12">
Expand All @@ -385,6 +385,15 @@ <h3>Older Posts</h3>
</div>


<div class="row">
<div class="col-sm-2">
2023-07-29
</div>
<div class="col-sm-10">
<a href="/2023/07/29/knip/">Recommendation Update: ✂️ Use knip to detect dead code and types</a>
</div>
</div>

<div class="row">
<div class="col-sm-2">
2023-06-27
Expand Down

0 comments on commit ccc1b7b

Please sign in to comment.