Лиття типу TypeScript або JavaScript


185

Яким чином обробляти тип кастингу в TypeScript або Javascript?

Скажіть, у мене є такий TypeScript-код:

module Symbology { 

    export class SymbolFactory { 

        createStyle( symbolInfo : SymbolInfo) : any { 
            if (symbolInfo == null)
            {
                 return null;
            }

            if (symbolInfo.symbolShapeType === "marker") {      

                // how to cast to MarkerSymbolInfo          
                return this.createMarkerStyle((MarkerSymbolInfo) symbolInfo);
            }                                  
        }

        createMarkerStyle(markerSymbol : MarkerSymbolInfo ): any { 
            throw "createMarkerStyle not implemented";
        }              

    }
}

де SymbolInfoбазовий клас. Як обробляти типажі від SymbolInfoдо MarkerSymbolInfoв друкованому або JavaScript?

Відповіді:


284

Ви можете зробити так:

return this.createMarkerStyle(<MarkerSymbolInfo> symbolInfo);

Або так, якщо ви хочете бути сумісними з режимом tsx:

return this.createMarkerStyle(symbolInfo as MarkerSymbolInfo);

Пам’ятайте лише, що це амплуа під час компіляції, а не амплуа виконання.


10
Тепер я бачу, що в документі, зазначеному як типи тверджень у розділі 4.13.
Клаус Нджі

Ця відповідь більше не забезпечує повне уявлення про затвердження типу в машинописі, тоді як відповідь Алекса дає більш повну картину і повинна бути прийнятою відповіддю.
Крістофер Дорф

@KristofferDorph Цій відповіді 4 роки. На момент написання TypeScript був у версії 0.8.1, і тому був правильною відповіддю на той час. Підтримка JSX була включена лише через 3 роки.
blorkfish

@blorkfish це правда, але це найкраща практика слідувати часом, тому люди, які задають те саме питання сьогодні, отримують поточну відповідь, а не таку, де 4 роки тому :-)
Kristoffer Dorph

160

Це називається затвердженням типу в TypeScript, а оскільки TypeScript 1.6, це можна виразити двома способами:

// Original syntax
var markerSymbolInfo = <MarkerSymbolInfo> symbolInfo;

// Newer additional syntax
var markerSymbolInfo = symbolInfo as MarkerSymbolInfo;

Обидві альтернативи функціонально однакові . Причиною введення as-синтаксису є те, що оригінальний синтаксис, конфліктуючий з JSX , див . Тут .

Якщо ви можете вибрати, просто використовуйте синтаксис, з яким ви відчуваєте себе більш комфортно. Особисто я віддаю перевагу asсинтаксису, оскільки відчувати себе більш вільно читати та писати.


2
Як ви вказуєте на машинопис, що ви перетворили об'єкт на інший тип? Наприклад, функція, яка повертає type2, всередині неї http отримує тип 1, чи робить логіку перетворення та повертає те, що було type1, але зараз type2?
Тоні Гутьеррес

@TonyGutierrez Як зробити конверсію?
Алекс

1
В основному беруть одну властивість і змінюють. Єдиний спосіб, який я знайшов це зробити, - це створити новий var (type2) та скопіювати в реквізит з type1var, а потім повернути його. Ви не можете змінити type1 і повернутись, або ви отримаєте помилку "Не можна віддати".
Тоні Гутьеррес

1

У Typecript можна зробити instanceofперевірку в операторі if, і ви отримаєте доступ до тієї ж змінної з Typedвластивостями.

Отже, скажімо, MarkerSymbolInfoмає властивість, що називається marker. Ви можете зробити наступне:

if (symbolInfo instanceof MarkerSymbol) {
    // access .marker here
    const marker = symbolInfo.marker
}

Приємний маленький трюк - отримати екземпляр змінної, використовуючи ту саму змінну, не потребуючи присвоєння їй іншого імені змінної.

Перегляньте ці два ресурси для отримання додаткової інформації:

TypeScript instanceof і JavaScript instance

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.