Некоторое время назад друг порекомендовал мне этоTypeScript
, Он сказал, что было очень круто писать, и дай мне попробовать, когда я еще был в этом непостижимом. Я был так занят в то время, что у меня не было времени смотреть. Я был очень занят в последнее время, поэтому я нашел время, чтобы проверить это.TypeScript
;просто скажиts
В основном предусмотреноdynamic type check
, что обеспечилоinterface
Особенность интерфейса может быть очень полезной при разработке проекта.TypeScript
даJavaScript
надмножество . Он сJavaScript
Есть сложные отношения.
TypeScript
Связанные команды
tsc -init //ts文件编译成js文件
tsc -w //实时监控文件编译,即一遍写ts代码保存的时候就可以看到js代码
бегатьtsc -init
будет генерировать позжеtsconfig.json
конфигурационный файл
функция
функцияJavaScript
Самый базовый юнит в нем, я сначала начинаю с функций и потихоньку узнаю большеTypeScript
грамматика и дальнейшее овладениеts
использование;
Необходимо проверить тип параметра функции, включая самые основные,string
иnumber
,string[]
,number[]
, и кортежи (=> обучение вводу кортежей => изучение базовых типов)
иJavaScript
Такой же,TypeScript
Функции могут создавать именованные функции и анонимные функции.
function add(x:number,y:number):number {
return x + y
} //有名函数
let myAdd = function(x:number,y:number):number {
return x + y
} //匿名函数
Мы набрали анонимную функцию только в правой части кода, а в левой части знака равенства.myAdd
Вывод типа выполняется с помощью операций присваивания, и записывается полный тип функции. (Вывод типа: если тип явно не указан, тоTypeScript
будет делать вывод из типа (Type Inference
), чтобы вывести тип. )
let myAdd: (x:number,y:number) => number =
function(x: number,y:number):number { return x + y}
Тип функции состоит из двух частей: типа параметра и типа возвращаемого значения.TypeScript
В определении типа => используется для обозначения определения функции, левая сторона — это тип ввода, который необходимо заключить в круглые скобки, правая сторона — это тип вывода, аES6
Функция стрелки не та
Дополнительные параметры и параметры по умолчанию
TypeScript
Каждый параметр функции является обязательным, и количество параметров, передаваемых функции, должно совпадать с количеством параметров, ожидаемых функцией, иначе будет сообщено об ошибке.
Обязательные параметры
function buildName(firstName:string,lastName:string) {
return firstName + " " + lastName
}
let result0 = buildName(12, 12); //提示 12 类型的参数不能赋值给 string
let result1 = buildName('Bob') //提示应该有两个参数,但是只获得一个
let result2 = buildName('Bob','Adams','"sr') //提示应该有两个参数,但是只获得三个
let result3 = buildName("Bob", "Adams"); //参数和传入的参数一样,不提示
необязательный параметр
Чтобы реализовать необязательную функцию параметров, нам нужно добавить имя параметра рядом с?
, но необязательные параметры должны следовать за параметром
function selectParam(firstName:string,lastName?:string) {
return firstName + " " + lastName
}
let selectParam1 = selectParam('bob')
let selectParam2 = selectParam('bob','Adam')
let selectParam2 = selectParam('bob','Adam') //两个变量无法重新声明
параметры по умолчанию
Мы можем предоставить значения по умолчанию для параметров.Если параметр со значением по умолчанию появляется перед обязательным параметром, пользователь должен явно передать его вundefined
значение, чтобы получить значение по умолчанию
function param(firstName:string,lastName = 'Smith') {
return firstName + ' ' + lastName
}
let param1 = param('bob')
let param2 = param('bob','Adam','kk') //提示参数应该是1-2个
остальные параметры
Необходимые параметры, параметры по умолчанию и необязательные параметры представляют определенный параметр. Иногда мы не знаем, сколько параметров нужно оперировать. Мы можем использовать...
манипулировать остальными параметрами
function restParam (firstName:string,...restOfName:string[]) {
return firstName + " " + restOfName.join(' ')
}
let employName = restParam ('Joseph',"Samuel","Bob")
//restParam 可以换一种形式
let restParamFun:(fname:string,...rest:string[]) => string = restParam
this
и стрелочная функция (тут видимо проблема, нужно дорабатывать)
существуетJavaScript
вthis
Значение указывается при вызове функции. ноTypeScript
указывается при создании
interface Card {
suit: string;
card: number;
}
interface Deck {
suits: string[];
cards: number[];
createCardPicker(this:Deck):()=>Card; //this 指向 Deck
}
let deck:Deck = {
suits:['hearts','spades','clubs'],
cards:Array(52),
createCardPicker:function(this:Deck) {
return () => {
let pickedCard = Math.floor(Math.random()*52)
let pickedSuit = Math.floor(pickedCard / 13);
return { suit: this.suits[pickedSuit],card:pickedCard % 13}
}
}
}
let cardPicker = deck.createCardPicker();
let pickedCard = cardPicker();
alert("card: " + pickedCard.card + " of " + pickedCard.suit);
еслиJavaScript
сообщит об ошибке, в это времяthis
указал наwindow
,ноTypeScript
Нет ошибки, уточнил он.this
На каком объекте он будет вызываться
базовый тип
существуетJavaScript
Существует два типа типов данных: примитивные типы данных (Boolean
,number
,string
,null
,undefined
,Synmbol
) и тип объекта, вTypeScript
Также используются данные примитивного типа. Чтобы программа имела ценность, нам нужно уметь обрабатывать простейшие единицы данных, числа, строки
числа, строки, массивы
let decLiteral:number = 6 //数字类型
let name1:string = 'bob' //字符串类型
let sentence:string = `Hello, my name is ${name1}` //字符串模板
let list0:number[] = [1,2,3,4] //[]形式定义数组
let list1:string[]=['12','12','90']
let list2:Array<number> = [1,23,4] //Array<元素类型>
let list3:Array<string> = ['1','23','4'] //Array<元素类型>
существуетTypeScript
В среде есть несколько определений типа массива, что является более гибким.
- тип + обозначение в квадратных скобках
let fibonacci:number[] = [1,2,3,4]//只能传number类型的,否则会提示错误
- 2. Массивы дженериков (=> перейдите к дженерикам, чтобы узнать)
let fibinacci: Array<number> = [1,2,3,4]
- 3. Используйте интерфейсы для представления массивов (=> переходите к интерфейсам для изучения)
interface NumberArray {
[index:number]: number
}
let fibonacci: NumberArray = [1,2,3,4]
NumberArray
Представление: это массив чисел,index
Это тип индекса массива, за которым следует массив чисел (это выражение кажется немного странным, пожалуйста, поправьте меня)
кортежTuple
Тип кортежа позволяет представить массив с известным количеством и типом элементов, причем каждый элемент не обязательно должен быть одного типа (массивы объединяют объекты одного типа, а кортежи объединяют объекты разных типов)
let x:[string,number];
x = ['Hello',10]
Перечисление: сценарии, в которых значение ограничено определенным диапазоном.
Например, в неделе всего семь дней.
enum Color { Red,Green,Blue}
let c:Color = Color.Green
any
На этапе программирования не ясно, что тип переменной задает тип, и значение может быть введено динамически, ноObject
Значение переменной типа позволяет присвоить ей любое значение, и нельзя вызывать у нее методы;
использоватьany
Типы заставляют эту функцию принимать любой тип аргумента, что приводит к потере некоторой информации; если мы передаем число, мы просто знаем, что потенциально может быть возвращено значение любого типа.
let list:any[] = ['Xcat Liu', 25, { website: 'http://xcatliu.com' }];
let notSure:any = 4
notSure = "maybe a string instead"
notSure = false
void
введите сany
противоположный тип
Он означает, что нет типа, когда есть функция, которая не возвращает
function warnUser():void {
console.log("This is my waring message")
}
undefined
иnull
, их собственные типы не очень полезны:Never
те никогда не существовавшие типы значений, которые представляет тип
утверждениеas
поверь мне, я знаю, что делаю
let someValue:any = "this is a string"
let strLength:number = (<string>someValue).length//“尖括号”语法
let strLength1: number = (someValue as string).length;//一个为as语法
Тип объединения: указывает, что значение может быть одним из многих типов.
let myFavoriteNumber:string|number;// 连接符 |
myFavoriteNumber = 'seven'
myFavoriteNumber = 7
Дженерики
В разработке программного обеспечения мы не просто создаем последовательно четко определенныеAPI
, но также учитывайте возможность повторного использования, компоненты могут поддерживать не только текущие типы данных, но и будущие типы данных, что предоставляет вам очень гибкие возможности при создании больших систем.
Используйте дженерики для создания повторно используемых компонентов; дженерики — этоСпециальные переменные, используемые только для представления типов, а не значений
общая функция
function identity<T>(arg:T):T {
return arg;
}
let output = identity<string>("myString")
Отличие: универсальная функция ничем не отличается от неуниверсальной функции, за исключением того, что она имеет параметр типа вверху, как объявление функции.
let myIdentity:<T>(arg:T) => T = identity
let myIdentity1:{ <T>(arg:T):T} = identity
Вы можете использовать количество объектов с вызовыми знаками, чтобы определить общие функции, мы можем взять поверхность слово объекта в качестве интерфейса, используйте универсальный параметр в качестве параметра всего интерфейса, поэтому мы можем четко знать, что ущерб, который является универсальным типом
универсальный интерфейс
interface GenericIdentityFn {
<T>(arg:T):T
}
function identity<T>(arg:T):T {
return arg
}
let myIdentity:GenericIdentityFn = identity
Общий класс (=> обучение в классе)
Универсальные классы похожи на универсальные интерфейсы.Общие классы используют () для включения универсального типа, за которым следует имя класса.
class GenericNumber<T> {
zeroValue:T,
add:(x:T,y:T)=>T
}
let myGenericNumber = new GeneriNumber<number>()
Класс состоит из двух частей: статической части и части экземпляра.Общий класс ссылается на часть экземпляра, поэтому статическое свойство не может использовать этот универсальный тип, а интерфейс определен для описания ограничений.
общие ограничения
interface Lengthwise {
length:number
}
function loggingIdentity<T extends Lengthwise>(arg:T):T {
console.log(arg.length)
return arg
}
extends
Наследование интерфейса и ограничение общей структуры данных
интерфейс
TypeScript
Одним из основных принципов является проверка типов структуры значения. Это абстракция поведения. Конкретные действия должны быть реализованы классами. Как правило, первая буква интерфейса пишется с заглавной буквы. В общем случае класс может наследоваться только от другого класса. Иногда между разными классами могут быть какие-то общие черты, но в это время они могут быть извлечены в интерфейсы и использованыinplements
ключевое слово для достижения, эта функция значительно повышает гибкость объектно-ориентированного
Преимущества необязательных свойств: определение возможных свойств, отлов ошибок при ссылке на несуществующее свойство
Свойство только для чтения (только для чтения)
Некоторые свойства объекта могут изменить свое значение только тогда, когда объект только что создан.
interface Point {
readonly x:number;
readonly y:number;
}
TypeScript
имеютReadonlyArray<T>
тип, аналогичныйArray<T>
Аналогично просто удаляются все изменяемые методы, чтобы гарантировать невозможность изменения массива после создания.
readonly vs const
Если мы хотим рассматривать его как переменную, просто используйтеconst
, если это атрибут, используйтеreadonly
Дополнительные проверки недвижимости
1. Эти проверки можно обойти с помощью утверждений типа (две формы утверждений)
let strLength:number = (<string>someValue).length //“尖括号”语法
let strLength1: number = (someValue as string).length //一个为 `as` 语法
2. С помощью индексных тегов объекты присваиваются другой переменной, литералы объектов обрабатываются особым образом и проверяются на наличие дополнительных свойств при назначении их переменным или передаче в качестве аргументов.
let squareOptions = { colour: "red", width: 100 }
let mySquare = createSquare(squareOptions)
3. Добавьте сигнатуру строкового индекса
interface SquareConfig {
color?:string;
width?:number;
[propName:string]:any
}
тип функции
Интерфейс может описыватьJavaScript
В дополнение к описанию различных представлений объектов в объекте, интерфейс также может быть описан как тип функции, он имеет определение функции с сигнатурой вызова, список параметров и тип возвращаемого значения, каждый параметр в списке параметров. Для параметра необходимо имя и тип.Имя параметра функции не обязательно должно совпадать с именем, определенным в интерфейсе.Если вы не укажете тип параметра,TypeScript
система типов выводит тип параметра
interface SearchFunc {
(source:string,subString:string):boolean;
}
let MySearch:SearchFunc;
MySearch = function(source:string,subString:string) {
let result = source.search(subString);
return result > -1
}
индексируемые типы
interface StringArray {
[index:number]:string
}
//let myArray:StringArray = ["Bob",'Fred']
let myArray:StringArray;
myArray = ["Bob",'Fred']
Тип класса реализует интерфейс, используя ключевое словоimplements
interface ClockInterface {
currentTime: Date;
}
class Clock implements ClockInterface {
currentTime:Date;
constructor(h:number,m:number){}
}
Наследовать расширение ключевого слова интерфейса
interface Shape {
color:string;
}
interface PenStroke {
penWidth:number;
}
interface Square extends Shape,PenStroke {
sideLength:number
}
let square = <Square>{}
extends
Это наследование класса.После наследования вы можете использовать метод родительского класса или переопределить метод родительского класса;
implements
Он реализует несколько интерфейсов.Методы интерфейсов обычно пусты и должны быть переписаны, прежде чем их можно будет использовать.
своего рода
Мы используем его, когда обращаемся к любому члену класса.this
, он указывает, что мы обращаемся к членам класса
своего рода(
Class
): определяют абстрактные характеристики вещи, включая ее свойства и методы.
объект (
Object
): экземпляр класса черезnew
генерировать
объектно-ориентированный (
OOP
) три основные характеристики: инкапсуляция, наследование, полиморфизм
упаковка (
Encapsulation
): скрыть детали операции с данными и открыть только внешний интерфейс.Внешний конец не нуждается (и не может) знать подробности и может получить доступ к объекту через предоставленный извне интерфейс, а также гарантирует, что внешний мир не может произвольно изменить внутреннюю часть данных объекта
наследовать(
Inheritance
): Подкласс наследует родительский класс.Помимо всех особенностей родительского класса, подкласс имеет еще несколько специфических особенностей.
полиморфизм (
Polymorphism
): связанные разные классы генерируются путем наследования и имеют разные ответы на один и тот же метод. НапримерCat
иDog
унаследовано отAnimal
, но реализовали своиeat
метод. На данный момент, например, нам не нужно знать, что этоCat
все ещеDog
, вы можете напрямую позвонитьeat
метод, программа автоматически определит, как выполнитьeat
аксессуар (
getter & setter
): используется для изменения поведения чтения и назначения свойств.
модификатор (
Modifiers
): модификаторы — это ключевые слова, определяющие свойства члена или типа.
абстрактный класс (
Abstract Class
): абстрактный класс — это базовый класс, который обеспечивает наследование от других классов, абстрактный класс не может быть создан, а абстрактные методы абстрактного класса должны быть реализованы в подклассах.
интерфейс(
Interface
): общедоступные свойства и методы между разными классами могут быть абстрагированы в интерфейс, а интерфейс может быть реализован классом (implements
), класс может наследоваться только от другого класса, но может реализовывать несколько интерфейсов.
class Greeter {
greeting:string;
constructor(message:string) {
this.greeting = message
}
greet() {
return "Hello" + this.greeting
}
}
let greeter = new Greeter("World")
new
структураGreeter
экземпляр класса, вызов ранее определенного конструктора, созданиеGreeter
новый объект типа, выполнить конструктор для его инициализации
наследовать
Чтобы расширить существующий класс путем наследования, базовый класс часто называют суперклассом (Animal
), производные классы часто называют подклассами (Dog
)
class Animal {
name: string;
constructor(theName: string) { this.name = theName; }
move(distanceInMeters:number = 0) {
console.log(`Animal moved ${distanceInMeters}`)
}
}
class Dog extends Animal {
constructor(name: string) { super(name); }
bark() {
console.log("woof woof")
}
move(distanceInMeters = 5) {
super.move(distanceInMeters)
}
}
const dog = new Dog()
dog.bark()
dog.move(10)
Производный класс содержит конструктор, который должен быть вызванsuper()
, он выполнит функцию базового класса, доступ к которой осуществляется в функции-конструктореthis
имущество, обязательно звонитеsuper()
. ЭтоTypeScript
Важное правило для соблюдения
Общие частные и защищенные модификаторы
В целомTypeScript
, участники по умолчаниюpublic
когда участники отмечены как
private
когда он не может объявить свой внешний доступ
protected
иprivate
Модификаторы ведут себя аналогично, но с одним отличиемprotected
Члены по-прежнему доступны в производных классах.
readonly
Ключевое слово устанавливает свойство только для чтения. Свойства только для чтения должны быть инициализированы в объявлении или конструкторе.
TypeScript
Используя систему структурных типов, когда мы сравниваем два разных типа, если члены типа совместимы, мы считаем их типы совместимыми.
аксессуар
TypeScript
поддержка черезgetters/setters
для перехвата доступа к членам объекта
let passcode = 'secret passcode'
class Employee {
private _fullName:string;
get fullName():string {
return this._fullName
}
set fullName(newName:string){
if (passcode && passcode == "secret passcode") {
this._fullName = newName
} else {
console.log("Error: Unauthorized update of employee!");
}
}
}
let employee = new Employee();
employee.fullName = "Bob Smith";
if (employee.fullName) {
alert(employee.fullName);
}
статические свойства
Когда свойство существует только в самом классе, а не в экземпляре класса, оно называется статическим идентификатором члена.static
абстрактный класс
Используемые в качестве базовых классов для других производных классов, они обычно не создаются напрямую, абстрактные методы в абстрактных классах не содержат конкретных реализаций и должны быть реализованы в производных классах. Синтаксис абстрактного метода аналогичен синтаксису метода интерфейса, оба определяют только сигнатуру метода, но не тело метода. Абстрактные классы могут содержать детали реализации членов и должны содержатьabstract
Идентификаторы ключевых слов и модификаторы доступа
abstract class Animal {
abstract makeSound():void
move():void {
console.log('roaming the earch...')
}
}
Используйте классы в качестве интерфейсов
Определение класса создает две вещи: экземпляр класса и конструктор. Классы могут создавать типы, поэтому вы можете использовать классы там, где разрешены интерфейсы.
class Point {
x:number;
y:number;
}
interface Point3d extends Point {
z:number
}
let point3d:Point3d = {x:1,y:2,z:3}
встроенные объекты
JavaScript
В программе много встроенных объектов.TypeScript
как определенный тип в
let b:Boolean = new Boolean(1)
let c:Error = new Error('Error occurred')
let d:Date = new Date()
let r:RegExp = /[a-z]/
DOM
иBOM
предусмотрены встроенные объекты, вTypeScript
часто используется в
Я пока напишу это здесь.Я продолжу в следующий раз.Есть много вещей, которые новички не понимают.Добро пожаловать, чтобы исправить меня и учиться и обмениваться.
Кажется, я работаю сверхурочно каждый день и всегда возвращаюсь домой поздно. заставь меня учитьсяTypeScript
Основная причина в том, что к коду предъявляются жесткие требования, и может появиться какое-то будущееbug
задушен в колыбели. Во время разработки проекта я написал публичный метод для разбора формата данных, отправляемых бэкендом.Вдруг однажды структура данных, предоставленная мне бэкендом, изменилась со строки на массив, всего один или два интерфейса. структура данных изменилась, но большая часть структуры данных не изменилась. Это заставило страницу сообщить об ошибке, построчном исключении кода и, наконец, найти публичный метод, что заняло у меня много времени. Я думал тогдаjava
Как хорошо, определить тип данных напрямую. Избегайте моей ситуации. я узнал позжеTypeScript
Также может. Медленно влюбляйтесь в него. К коду предъявляются строгие требования, заранееdebug
, Я готов усердно учиться в последнее время, я должен учиться, когда я занят, но это удобно.
изучениеTypeScript
Что касается официальных документов, я сравниваюjava
Я выучил грамматику, я чувствую, что грамматика очень похожа. Я постоянно спрашиваю своих коллег, выjava
Есть ли в нем грамматика?implements
иextends
, и попросил ихjava
их отличие. Мои коллеги думали, что я учусьjava
, я сказал им сказать аналогию с передним концом
имеютTypeScript
Ищите рекомендации по материалам, делитесь ресурсами, дважды читайте официальные документы и планируйте объединить проект для реальных боевых действий в будущем. Если у вас есть соответствующий опыт разработки, представьте, что вы учитесь и общаетесь, ха-ха, вам нужен старый водитель, чтобы меня отвезти ха-ха