Needle Engine
  • README
  • Code Of Conduct
  • HOW TO
  • documentation
    • SUMMARY
    • _backlog-mermaid
    • _backlog
    • _meta-test
    • Automatic Component Generation
    • Needle Core Components
    • How To Debug
    • Deployment and Optimization
    • embedding
    • Everywhere Actions
    • Example Projects ✨
    • Exporting Assets, Animations, Prefabs, Materials, Lightmaps...
    • Questions and Answers (FAQ) 💡
    • Feature Overview
    • This page has been moved: continue here
    • getting-started
    • Frameworks, Bundlers, HTML
    • index
    • Additional Modules
    • Networking
    • Needle Engine Project Structure
    • Samples Projects
    • Scripting Examples
    • Creating and using Components
    • Live
    • Live
    • About
    • Live
    • Live
    • Live
    • Live
    • Support, Community & AI
    • Technical Overview
    • Testimonials
    • Testing on local devices
    • Using Needle Engine directly from HTML
    • vision
    • VR & AR (WebXR)
    • blender
      • Needle Engine for Blender
    • cloud
      • Needle Cloud
    • custom-integrations
      • index
    • getting-started
      • Scripting Introduction for Unity Developers
      • Getting Started & Installation
      • Scripting in Needle Engine
    • reference
      • needle.config.json
      • <needle-engine> Configuration
      • @serializable and other decorators
    • three
      • index
    • unity
      • Editor Sync
      • Needle Engine for Unity
    • lang
      • de
        • 404
        • SUMMARY
        • Automatische Komponenten-Generierung
        • Needle-Kernkomponenten
        • Debugging
        • Bereitstellung und Optimierung
        • embedding
        • Everywhere Actions
        • Beispielprojekte ✨
        • Assets, Animationen, Prefabs, Materialien, Lightmaps exportieren...
        • Fragen und Antworten (FAQ) 💡
        • Funktionsübersicht
        • Diese Seite wurde verschoben: hier fortfahren
        • getting-started
        • Frameworks, Bundler, HTML
        • index
        • Zusätzliche Module
        • Netzwerkfunktionen
        • Needle Engine Projektstruktur
        • Beispielprojekte
        • Scripting Beispiele
        • Erstellen und Verwenden von Komponenten
        • Live
        • Live
        • Über
        • Live
        • Live
        • Live
        • Live
        • Support und Community
        • Technischer Überblick
        • Erfahrungsberichte
        • Testen auf lokalen Geräten
        • Needle Engine direkt aus HTML verwenden
        • vision
        • VR & AR (WebXR)
        • blender
          • Needle Engine für Blender
        • cloud
          • Needle Cloud
        • custom-integrations
          • index
        • getting-started
          • Einführung in das Scripting für Unity-Entwickler
          • Erste Schritte & Installation
          • Scripting in Needle Engine
        • reference
          • needle.config.json
          • <needle-engine> Konfiguration
          • @serializable und andere Decorators
        • three
          • index
        • unity
          • Editor Synchronisierung
          • Needle Engine für Unity
      • es
        • SUMMARY
        • Generación Automática de Componentes
        • Componentes principales de Needle
        • Cómo Depurar
        • Despliegue y optimización
        • embedding
        • Acciones Everywhere
        • Proyectos de Ejemplo ✨
        • Exportación de Assets, Animaciones, Prefabs, Materiales, Lightmaps...
        • Preguntas Frecuentes (FAQ) 💡
        • Resumen de Características
        • Esta página ha sido movida: continúe aquí
        • getting-started
        • Frameworks, Bundlers, HTML
        • index
        • Módulos Adicionales
        • Redes
        • Estructura de Proyecto de Needle Engine
        • Proyectos de ejemplo
        • Ejemplos de scripting
        • Crear y usar Components
        • En vivo
        • En Vivo
        • Acerca de
        • En vivo
        • En vivo
        • En vivo
        • En vivo
        • Soporte y Comunidad
        • Resumen técnico
        • Testimonios
        • Testing on local devices
        • Usando Needle Engine directamente desde HTML
        • vision
        • VR & AR (WebXR)
        • blender
          • Needle Engine para Blender
        • cloud
          • Needle Cloud
        • custom-integrations
          • index
        • getting-started
          • Introducción al Scripting para Desarrolladores de Unity
          • Primeros pasos e instalación
          • Scripting in Needle Engine
        • reference
          • needle.config.json
          • Configuración de <needle-engine>
          • @serializable y otros decoradores
        • three
          • index
        • unity
          • Editor Sync
          • Needle Engine para Unity
      • fr
        • SUMMARY
        • Génération automatique de composants
        • Composants principaux de Needle
        • Comment déboguer
        • Déploiement et Optimisation
        • embedding
        • Everywhere Actions
        • Exemples de Projets ✨
        • Exporter des Assets, des Animations, des Prefabs, des Matériaux, des Lightmaps...
        • Questions et Réponses (FAQ) 💡
        • Aperçu des fonctionnalités
        • Cette page a été déplacée : continuez ici
        • getting-started
        • Frameworks, Bundlers, HTML
        • index
        • Modules supplémentaires
        • Réseau
        • Structure du projet Needle Engine
        • Projets d'exemples
        • Exemples de Scripting
        • Créer et utiliser des Components
        • showcase-bike
        • En direct
        • À propos
        • En direct
        • Jouer
        • En direct
        • En direct
        • Support et Communauté
        • Vue d'ensemble technique
        • Témoignages
        • Tester sur les appareils locaux
        • Utiliser Needle Engine directement depuis HTML
        • vision
        • VR & AR (WebXR)
        • blender
          • Needle Engine pour Blender
        • cloud
          • Needle Cloud
        • custom-integrations
          • index
        • getting-started
          • Introduction au Scripting pour les Développeurs Unity
          • Premiers pas et installation
          • Scripting in Needle Engine
        • reference
          • needle.config.json
          • <needle-engine> Configuration
          • @serializable et autres décorateurs
        • three
          • index
        • unity
          • Synchronisation de l'Editor (Editor Sync)
          • Needle Engine pour Unity
      • hi
        • SUMMARY
        • कंपोनेंट का स्वतः जनरेशन
        • नीडल कोर कंपोनेंट्स
        • How To Debug
        • Deployment and Optimization
        • embedding
        • Everywhere Actions
        • उदाहरण प्रोजेक्ट ✨
        • एसेट, एनिमेशन, प्रीफैब, मटेरियल, लाइटमैप्स... को एक्सपोर्ट करना
        • प्रश्न और उत्तर (FAQ) 💡
        • सुविधा अवलोकन
        • यह पृष्ठ स्थानांतरित कर दिया गया है: यहां जारी रखें
        • getting-started
        • Frameworks, Bundlers, HTML
        • index
        • अतिरिक्त मॉड्यूल
        • नेटवर्किंग
        • Needle Engine प्रोजेक्ट स्ट्रक्चर
        • samples-and-modules
        • स्क्रिप्टिंग उदाहरण
        • कंपोनेंट बनाना और उपयोग करना
        • लाइव
        • लाइव
        • परिचय
        • लाइव
        • लाइव
        • लाइव
        • लाइव
        • समर्थन और समुदाय
        • तकनीकी अवलोकन
        • प्रशंसापत्र
        • Testing on local devices
        • HTML से सीधे Needle Engine का उपयोग करना
        • vision
        • VR & AR (WebXR)
        • blender
          • Needle Engine for Blender
        • cloud
          • Needle Cloud
        • custom-integrations
          • index
        • getting-started
          • Unity डेवलपर्स के लिए स्क्रिप्टिंग परिचय
          • आरंभ करना और इंस्टॉलेशन
          • Needle Engine में स्क्रिप्टिंग
        • reference
          • needle.config.json
          • <needle-engine> कॉन्फ़िगरेशन
          • @serializable and other decorators
        • three
          • index
        • unity
          • Editor Sync
          • Unity के लिए Needle Engine
      • ja
        • SUMMARY
        • 自動コンポーネント生成
        • Needleコアコンポーネント
        • デバッグの方法
        • デプロイと最適化
        • embedding
        • Everywhere Actions
        • サンプルプロジェクト ✨
        • アセット、アニメーション、Prefab、マテリアル、ライトマップなどのエクスポート
        • よくある質問(FAQ)💡
        • 機能概要
        • このページは移動しました: こちらからどうぞ
        • getting-started
        • フレームワーク、バンドラー、HTML
        • index
        • 追加モジュール
        • ネットワーキング
        • Needle Engineプロジェクトの構造
        • サンプルプロジェクト
        • スクリプティング例
        • Creating and using Components
        • ライブ
        • showcase-castle
        • 概要
        • ライブ
        • ライブ
        • ライブ
        • ライブ
        • サポートとコミュニティ
        • 技術概要
        • お客様の声
        • ローカルデバイスでのテスト
        • HTMLからNeedle Engineを直接使用する
        • vision
        • VR & AR (WebXR)
        • blender
          • Blender 用 Needle Engine
        • cloud
          • Needle Cloud
        • custom-integrations
          • index
        • getting-started
          • Scripting Introduction for Unity Developers
          • はじめに & インストール
          • Needle Engineでのスクリプティング
        • reference
          • needle.config.json
          • <needle-engine> 設定
          • @serializable およびその他のデコレーター
        • three
          • index
        • unity
          • Editor Sync
          • Unity用Needle Engine
      • pt
        • SUMMARY
        • Automatic Component Generation
        • Componentes Principais do Needle
        • Como Depurar
        • Implementação e Otimização
        • embedding
        • Everywhere Actions
        • Projetos de Exemplo ✨
        • Exportar Recursos, Animações, Prefabs, Materiais, Lightmaps...
        • Perguntas e Respostas (FAQ) 💡
        • Visão Geral dos Recursos
        • Esta página foi movida: continue aqui
        • getting-started
        • Frameworks, Bundlers, HTML
        • index
        • Módulos Adicionais
        • Redes
        • Estrutura do Projeto Needle Engine
        • Projetos de Exemplo
        • Exemplos de Scripting
        • Criar e usar Componentes
        • Ao Vivo
        • Ao Vivo
        • Sobre
        • Ao Vivo
        • Ao Vivo
        • Ao Vivo
        • Ao Vivo
        • Suporte e Comunidade
        • Visão Geral Técnica
        • Depoimentos
        • Testar em dispositivos locais
        • vanilla-js
        • vision
        • VR & AR (WebXR)
        • blender
          • Needle Engine para Blender
        • cloud
          • Needle Cloud
        • custom-integrations
          • index
        • getting-started
          • Introdução à Scripting para Developers Unity
          • Começar e Instalação
          • Scripting no Needle Engine
        • reference
          • needle.config.json
          • needle-engine-attributes
          • @serializable e outros decorators
        • three
          • index
        • unity
          • Sincronização do Editor
          • Needle Engine para Unity
      • vn
        • 404
        • SUMMARY
        • Automatic Component Generation
        • Các Component Cốt lõi của Needle
        • Cách gỡ lỗi
        • Triển khai và Tối ưu hóa
        • embedding
        • Hành động ở mọi nơi (Everywhere Actions)
        • Các Dự Án Ví Dụ ✨
        • Xuất Tài sản, Hoạt ảnh, Prefab, Vật liệu, Lightmap...
        • Câu hỏi thường gặp (FAQ) 💡
        • Tổng quan tính năng
        • Trang này đã được di chuyển: tiếp tục tại đây
        • getting-started
        • Frameworks, Bundlers, HTML
        • index
        • Các Module Bổ Sung
        • Kết nối mạng
        • Cấu trúc dự án Needle Engine
        • samples-and-modules
        • Ví dụ về Scripting
        • Tạo và sử dụng Component
        • Trực tiếp
        • Trực tiếp
        • Giới thiệu
        • Trực tiếp
        • Chơi thử
        • Trực tiếp
        • Demo trực tiếp
        • Hỗ trợ và Cộng đồng
        • Tổng quan kỹ thuật
        • Lời chứng thực
        • Testing on local devices
        • Sử dụng Needle Engine trực tiếp từ HTML
        • vision
        • VR & AR (WebXR)
        • blender
          • Needle Engine cho Blender
        • cloud
          • Needle Cloud
        • custom-integrations
          • index
        • getting-started
          • Giới thiệu về Scripting cho các nhà phát triển Unity
          • Getting Started & Installation
          • Scripting trong Needle Engine
        • reference
          • needle.config.json
          • Cấu hình <needle-engine>
          • @serializable và các decorator khác
        • three
          • index
        • unity
          • Editor Sync
          • Needle Engine cho Unity
      • zh
        • SUMMARY
        • 自动生成组件
        • Needle 核心组件
        • 如何调试
        • 部署与优化
        • embedding
        • Everywhere Actions
        • 示例项目 ✨
        • 导出资源、动画、预制体、材质、光照贴图...
        • 常见问题 (FAQ) 💡
        • 功能概览
        • 此页面已移动:请在此处继续
        • getting-started
        • 框架、打包器、HTML
        • index
        • 附加模块
        • 网络
        • Needle Engine 项目结构
        • 示例项目
        • Scripting Examples
        • Creating and using Components
        • 实时示例
        • 实时
        • 关于
        • 实时演示
        • 在线试玩
        • 实时演示
        • 现场演示
        • 支持与社区
        • 技术概述
        • 用户评价
        • Testing on local devices
        • 使用 Needle Engine 直接从 HTML
        • vision
        • VR & AR (WebXR)
        • blender
          • Needle Engine for Blender
        • cloud
          • Needle Cloud
        • custom-integrations
          • index
        • getting-started
          • Scripting Introduction for Unity Developers
          • 入门与安装
          • 在 Needle Engine 中编写脚本
        • reference
          • needle.config.json
          • <needle-engine> 配置
          • @serializable and other decorators
        • three
          • index
        • unity
          • 编辑器同步
          • Unity 版 Needle Engine
Powered by GitBook
On this page
Edit on GitHub
  1. documentation
  2. lang
  3. pt
  4. getting-started

Scripting no Needle Engine

Diferenças, semelhanças e conceitos chave de Typescript, Javascript e C#.

PreviousComeçar e InstalaçãoNextreference

Last updated 25 days ago

O seguinte guia tenta destacar algumas das principais diferenças entre C#, Javascript e Typescript. Isto é mais útil para programadores novos no ecossistema web.

Aqui ficam também alguns recursos úteis para aprender a escrever Typescript:

Principais diferenças entre C#, Javascript ou Typescript

CSharp ou C# é uma linguagem de tipo estático e compilada. Significa que antes do seu código poder correr (ou ser executado), tem de ser compilado - traduzido - para IL ou CIL, uma linguagem intermédia que está um pouco mais perto do código de máquina. A parte importante a entender aqui é que o seu código é analisado e tem de passar certas verificações e regras que são aplicadas pelo compilador. Obterá erros de compilação no Unity e a sua aplicação nem sequer começará a correr se escrever código que viole alguma das regras da linguagem C#. Não conseguirá entrar no Play-Mode com erros de compilação.

O Javascript, por outro lado, é interpretado em tempo de execução. Isso significa que pode escrever código que não é válido e causar erros - mas não verá esses erros até que o seu programa corra ou tente executar exatamente a linha que contém o erro. Por exemplo, pode escrever var points = 100; points += "hello world"; e ninguém reclamará até que execute o código num navegador.

Typescript é uma linguagem concebida pela Microsoft que compila para javascript Adiciona muitas funcionalidades, como por exemplo, segurança de tipo. Isso significa que, ao escrever código em Typescript, pode declarar tipos e, portanto, obter erros em tempo de compilação quando tentar, por exemplo, fazer atribuições inválidas ou chamar métodos com tipos inesperados. Leia mais sobre tipos em Javascript e Typescript abaixo.

Tipos — ou a falta deles

O Vanilla Javascript (até hoje) não tem qualquer conceito de tipos: não há garantia de que uma variável que declarou como let points = 100 continue a ser um número mais tarde na sua aplicação. Isso significa que, em Javascript, é código perfeitamente válido atribuir points = new Vector3(100, 0, 0); mais tarde no seu código. Ou mesmo points = null ou points = myRandomObject - percebeu a ideia. Tudo isto está OK enquanto escreve o código mas pode falhar terrivelmente quando o seu código é executado, porque mais tarde escreve points -= 1 e agora obtém erros no navegador quando a sua aplicação já está a correr.

Como mencionado acima, o Typescript foi criado para ajudar a corrigir esse problema, adicionando sintaxe para definir tipos.

É importante entender que basicamente ainda escreve Javascript quando escreve Typescript e, embora seja possível contornar todas as verificações de tipo e segurança, por exemplo, adicionando //@ts-ignore acima de uma linha errada ou definindo todos os tipos como any, isto não é de todo recomendado. Os tipos estão aqui para o ajudar a encontrar erros antes que realmente aconteçam. Não quer realmente implementar o seu site no seu servidor apenas para mais tarde receber relatórios de utilizadores ou visitantes a dizer que a sua aplicação falhou enquanto estava a correr.

Embora o Vanilla Javascript não ofereça tipos, ainda pode adicionar anotações de tipo às suas variáveis, classes e métodos javascript usando .

Variáveis

Em C#, escreve variáveis usando o tipo ou a palavra-chave var. Por exemplo, pode escrever int points = 100; ou, alternativamente, usar var e deixar o compilador descobrir o tipo correto para si: var points = 100

Em Javascript ou Typescript, tem duas opções modernas para declarar uma variável. Para uma variável que planeia reatribuir, use let, por exemplo let points = 100; Para uma variável que não quer poder reatribuir, use const, por exemplo const points = 100;

Por favor, note que ainda pode atribuir valores a variáveis declaradas com const se forem (por exemplo) um tipo personalizado. Considere o seguinte exemplo:

import { Vector3 } from "three";
// ---cut-before---
const myPosition : Vector3 = new Vector3(0, 0, 0);
myPosition.x = 100; // Atribuir x é perfeitamente válido

O acima é código Typescript perfeitamente válido porque não reatribui myPosition, mas apenas o membro x de myPosition. Por outro lado, o seguinte exemplo não seria permitido e causaria um erro de execução ou typescript:

// @errors: 2588
import { Vector3 } from "three";
// ---cut-before---
const myPosition : Vector3 = new Vector3(0, 0, 0);
myPosition = new Vector3(100, 0, 0); // ⚠ ATRIBUIR A CONST NÃO É PERMITIDO

Usando ou Importando Tipos

No Unity, geralmente adiciona instruções using no topo do seu código para importar namespaces específicos de Assemblies que são referenciados no seu projeto ou - em certos casos - pode encontrar-se a importar um tipo específico com um nome de um namespace. Veja o seguinte exemplo:

using UnityEngine;
// importando apenas um tipo específico e dando-lhe um nome
using MonoBehaviour = UnityEngine.MonoBehaviour;

É assim que faz o mesmo em Typescript para importar tipos específicos de um pacote:

import { Vector3 } from 'three';
import { Behaviour } from '@needle-tools/engine';

Também pode importar todos os tipos de um pacote específico, dando-lhe um nome, o que poderá ver aqui e ali:

import * as THREE from 'three';
const myVector : THREE.Vector3 = new THREE.Vector3(1, 2, 3);

Tipos Primitivos

Vector2, Vector3, Vector4... Se tiver formação em C#, poderá estar familiarizado com a diferença entre uma classe e uma struct. Enquanto uma classe é um tipo de referência, uma struct é um tipo de valor personalizado. Significando que é, dependendo do contexto, alocada na stack e, ao ser passada para um método por padrão, é criada uma cópia. Considere o seguinte exemplo em C#:

void MyCallerMethod(){
    var position = new Vector3(0,0,0);
    MyExampleVectorMethod(position);
    UnityEngine.Debug.Log("Position.x is " + position.x); // Aqui x será 0
}
void MyExampleVectorMethod(Vector3 position){
    position.x = 42;
}

É chamado um método com um Vector3 chamado position. Dentro do método, o vetor position passado é modificado: x é definido para 42. Mas em C#, o vetor original que está a ser passado para este método (ver linha 2) não é alterado e x ainda será 0 (linha 4).

O mesmo não é verdade para Javascript/Typescript. Aqui não temos tipos de valor personalizados, o que significa que se encontrar um Vector no Needle Engine ou three.js, terá sempre um tipo de referência. Considere o seguinte exemplo em typescript:

import { Vector3 } from 'three'

function myCallerMethod() : void {
    const position = new Vector3(0,0,0);
    myExampleVectorMethod(position);
    console.log("Position.x is " + position.x); // Aqui x será 42
}
function myExampleVectorMethod(position: Vector3) : void {
    position.x = 42;
}

Consegue ver a diferença? Como os vetores e todos os objetos personalizados são de facto tipos de referência, teremos modificado a variável position original (linha 3) e x é agora 42.

Isto não é importante apenas para entender em métodos, mas também ao trabalhar com variáveis. Em C#, o seguinte código produzirá duas instâncias de Vector3 e alterar uma não afetará a outra:

var myVector = new Vector3(1,1,1);
var myOtherVector = myVector;
myOtherVector.x = 42;
// registará: 1, 42
UnityEngine.Debug.Log(myVector.x + ", " + myOtherVector.x);

Se fizer o mesmo em Typescript, não criará uma cópia, mas obterá uma referência à mesma instância de myVector.

import { Vector3 } from 'three'

const myVector = new Vector3(1,1,1);
const myOtherVector = myVector;
myOtherVector.x = 42;
// registará: 42, 42
console.log(myVector.x, myOtherVector.x);

Matemática de Vetores e Operadores

Embora em C# possa usar sobrecarga de operadores, infelizmente, isto não está disponível em Javascript. Isto significa que, embora possa multiplicar um Vector3 em C# assim:

var myFirstVector = new Vector3(1,1,1);
var myFactor = 100f;
myFirstVector *= myFactor;
// → myFirstVector é agora 100, 100, 100

tem de usar um método no tipo Vector3 para alcançar o mesmo resultado (apenas com um pouco mais de código boilerplate)

import { Vector3 } from "three"

const myFirstVector : Vector3 = new Vector3(1, 1, 1)
const myFactor = 100;
myFirstVector.multiplyScalar(myFactor);
// → myFirstVector é agora 100, 100, 100

Verificações de Igualdade

comparação solta vs rigorosa

Em C#, quando quer verificar se duas variáveis são iguais, pode escrevê-lo da seguinte forma:

var playerIsNull = myPlayer == null;

em Javascript/Typescript existe uma diferença entre == e ===, onde === verifica o tipo de forma mais rigorosa:

const myPlayer: any = null;
// ---cut-before---
const playerIsNull = myPlayer === null;
const playerIsNullOrUndefined = myPlayer == null;

Eventos, Binding e this

Quando subscreve um Evento em C#, faz assim:

// é assim que um evento é declarado
event Action MyEvent;
// subscreve adicionando a (ou removendo de)
void OnEnable() {
    MyEvent += OnMyEvent;
}
void OnDisable() {
    MyEvent -= OnMyEvent;
}
void OnMyEvent() {}

Em Typescript e Javascript, quando adiciona um método a uma lista, tem de fazer "bind this". Isso essencialmente significa que cria um método onde define explicitamente this para (geralmente) a sua instância da classe atual. Existem duas maneiras de conseguir isto.

Por favor, note que estamos a usar o tipo EventList aqui, que é um tipo do Needle Engine para declarar eventos (a EventList também será automaticamente convertida para UnityEvent e/ou uma lista de eventos no Blender quando os usar com as nossas integrações de Editor)

import { EventList, Behaviour, serializable } from "@needle-tools/engine";

export class MyComponent extends Behaviour {

    @serializable(EventList)
    myEvent!: EventList;

    onEnable() {
        this.myEvent.addEventListener(this.onMyEvent);
    }

    onDisable() {
        this.myEvent.removeEventListener(this.onMyEvent);
    }

    // Declarando a função como uma arrow function para ligar automaticamente `this`
    private onMyEvent = () => {
        console.log(this !== undefined, this)
    }
}

Há também a forma "clássica" mais verbosa de conseguir o mesmo, ligando manualmente isto (e guardando o método numa variável para depois o remover novamente da lista de eventos):

import { EventList, Behaviour, serializable } from "@needle-tools/engine";

export class MyComponent extends Behaviour {

    @serializable(EventList)
    myEvent?: EventList;

    private _onMyEventFn?: Function;

    onEnable() {
        // ligar this
        this._onMyEventFn = this.onMyEvent.bind(this);
        // adicionar o método ligado ao evento
        this.myEvent?.addEventListener(this._onMyEventFn);
    }

    onDisable() {
        this.myEvent?.removeEventListener(this._onMyEventFn);
    }

    // Declarando a função como uma arrow function para ligar automaticamente `this`
    private onMyEvent = () => { }
}

Qual é o próximo passo?

Página traduzida automaticamente usando IA

Esteja ciente de var Pode encontrar a palavra-chave var em javascript também, mas não é recomendado usá-la, e a substituição moderna para ela é let. Saiba mais sobre .

Repara que a segunda variável playerIsNullOrUndefined usa ==, que faz uma verificação de igualdade solta, caso em que null e undefined resultarão ambos em true aqui. Pode ler mais sobre isso

A sintaxe curta e recomendada para fazer isto é usar .

Tutorial de Typescript
Aprender Typescript
Documentação de Typescript
JSDoc
var vs let
aqui
Arrow Functions
Scripting no Needle Engine