टाइपस्क्रिप्ट के साथ इंटरफ़ेस प्रकार की जांच


294

यह प्रश्न टाइपस्क्रिप्ट के साथ क्लास टाइप चेक के लिए सीधा एनालॉग है

मुझे रनटाइम पर यह पता लगाने की आवश्यकता है कि कोई चर किसी इंटरफ़ेस को लागू करता है या नहीं। यहाँ मेरा कोड है:

interface A{
    member:string;
}

var a:any={member:"foobar"};

if(a instanceof A) alert(a.member);

यदि आप इस कोड को टाइपस्क्रिप्ट खेल के मैदान में दर्ज करते हैं, तो अंतिम पंक्ति को एक त्रुटि के रूप में चिह्नित किया जाएगा, "वर्तमान स्कोप में A का नाम मौजूद नहीं है"। लेकिन यह सच नहीं है, नाम मौजूदा दायरे में मौजूद है। मैं भी var a:A={member:"foobar"};संपादक से शिकायतों के बिना चर घोषणा को बदल सकते हैं । वेब ब्राउज़ करने और एसओ पर अन्य प्रश्न खोजने के बाद मैंने इंटरफ़ेस को एक वर्ग में बदल दिया, लेकिन फिर मैं इंस्टेंस बनाने के लिए ऑब्जेक्ट शाब्दिक का उपयोग नहीं कर सकता।

मुझे आश्चर्य हुआ कि टाइप ए कैसे गायब हो सकता है लेकिन उत्पन्न जावास्क्रिप्ट पर एक नज़र समस्या की व्याख्या करती है:

var a = {
    member: "foobar"
};
if(a instanceof A) {
    alert(a.member);
}

एक इंटरफ़ेस के रूप में ए का कोई प्रतिनिधित्व नहीं है, इसलिए कोई रनटाइम प्रकार की जांच संभव नहीं है।

मैं समझता हूं कि एक गतिशील भाषा के रूप में जावास्क्रिप्ट में इंटरफेस की कोई अवधारणा नहीं है। क्या इंटरफेस के लिए चेक टाइप करने का कोई तरीका है?

टाइपस्क्रिप्ट खेल के मैदान का स्वत: पूर्णता पता चलता है कि टाइपस्क्रिप्ट भी एक विधि प्रदान करता है implements। मुझे इसे कैसे प्रयोग में लाना है ?


4
जावास्क्रिप्ट में इंटरफेस की कोई अवधारणा नहीं है, लेकिन ऐसा नहीं है क्योंकि यह एक गतिशील भाषा है। ऐसा इसलिए है क्योंकि इंटरफेस अभी तक लागू नहीं हुए हैं।
trusktr

हां, लेकिन आप इंटरफ़ेस के बजाय कक्षा का उपयोग कर सकते हैं। इस उदाहरण को देखें ।
एलेक्सी बरनोशनिकोव

2017 में स्पष्ट रूप से नहीं। सुपर प्रासंगिक सवाल अब।
डबलजोश

जवाबों:


221

आप instanceofकीवर्ड के बिना जो चाहें प्राप्त कर सकते हैं क्योंकि अब आप कस्टम टाइप गार्ड लिख सकते हैं:

interface A{
    member:string;
}

function instanceOfA(object: any): object is A {
    return 'member' in object;
}

var a:any={member:"foobar"};

if (instanceOfA(a)) {
    alert(a.member);
}

सदस्यों के बहुत सारे

यदि आपको यह निर्धारित करने के लिए बहुत सारे सदस्यों की जांच करने की आवश्यकता है कि क्या कोई वस्तु आपके प्रकार से मेल खाती है, तो आप इसके बजाय एक भेदभाव जोड़ सकते हैं। नीचे सबसे बुनियादी उदाहरण है, और आपको अपने स्वयं के भेदभावकर्ताओं को प्रबंधित करने की आवश्यकता है ... आपको डुप्लीकेट भेदभाव करने वालों से बचने के लिए पैटर्न में गहराई से उतरने की आवश्यकता होगी।

interface A{
    discriminator: 'I-AM-A';
    member:string;
}

function instanceOfA(object: any): object is A {
    return object.discriminator === 'I-AM-A';
}

var a:any = {discriminator: 'I-AM-A', member:"foobar"};

if (instanceOfA(a)) {
    alert(a.member);
}

85
"इंटरफ़ेस को रनटाइम चेक करने का कोई तरीका नहीं है।" वहाँ है, वे अभी तक जो भी कारण के लिए इसे लागू नहीं किया है।
trusktr

16
और अगर इंटरफ़ेस में 100 सदस्य हैं, तो आपको सभी 100 की जांच करने की आवश्यकता है? Foobar।
जेनी ओ'रिली ने

4
आप सभी 100 की जांच के बजाय अपनी वस्तु में एक भेदभाव करनेवाला जोड़ सकते हैं ...
फेंटन

7
यह विभेदक प्रतिमान (जैसा कि यहां लिखा गया है) विस्तार देने वाले इंटरफेस का समर्थन नहीं करता है। एक व्युत्पन्न इंटरफ़ेस गलत होगा यदि जाँचता है कि क्या यह एक उदाहरण है यदि एक आधार इंटरफ़ेस है।
हारून

1
@ फ़ेंटन शायद मैं इस बारे में पर्याप्त नहीं जानता, लेकिन मान लीजिए कि आपके पास एक इंटरफ़ेस B था जो इंटरफ़ेस A को विस्तारित करता है, आप isInstanceOfA(instantiatedB)सही लौटना चाहते हैं , लेकिन आप isInstanceOfB(instantiatedA)गलत वापस करना चाहते हैं। बाद के होने के लिए, बी के भेदभावकर्ता को 'आई-एएम-ए' नहीं होना चाहिए?
हारून

87

टाइपस्क्रिप्ट 1.6 में, उपयोगकर्ता-परिभाषित प्रकार का गार्ड काम करेगा।

interface Foo {
    fooProperty: string;
}

interface Bar {
    barProperty: string;
}

function isFoo(object: any): object is Foo {
    return 'fooProperty' in object;
}

let object: Foo | Bar;

if (isFoo(object)) {
    // `object` has type `Foo`.
    object.fooProperty;
} else {
    // `object` has type `Bar`.
    object.barProperty;
}

और जैसा कि जो यांग ने उल्लेख किया है: टाइपस्क्रिप्ट 2.0 के बाद से, आप टैग किए गए यूनियन प्रकार का भी लाभ उठा सकते हैं।

interface Foo {
    type: 'foo';
    fooProperty: string;
}

interface Bar {
    type: 'bar';
    barProperty: number;
}

let object: Foo | Bar;

// You will see errors if `strictNullChecks` is enabled.
if (object.type === 'foo') {
    // object has type `Foo`.
    object.fooProperty;
} else {
    // object has type `Bar`.
    object.barProperty;
}

और इसके साथ काम switchभी करता है।


1
यह बल्कि उत्सुक लग रहा है। जाहिरा तौर पर किसी तरह की मेटा-जानकारी उपलब्ध है। इस प्रकार के गार्ड सिंटैक्स के साथ इसे क्यों उजागर करें। किन कार्यों के कारण आइंस्टीनोफ़ के विपरीत, एक फ़ंक्शन कार्य के बगल में "ऑब्जेक्ट इंटरफ़ेस है"? अधिक सटीक रूप से, यदि आप सीधे कथन में "ऑब्जेक्ट इंटरफ़ेस है" का उपयोग कर सकते हैं? लेकिन किसी भी मामले में, मुझसे बहुत दिलचस्प वाक्यविन्यास, +1।
lhk

1
@lhk नहीं, ऐसा कोई कथन नहीं है, यह एक विशेष प्रकार की तरह है जो बताता है कि सशर्त शाखाओं के अंदर एक प्रकार को कैसे संकुचित किया जाना चाहिए। टाइपस्क्रिप्ट के "स्कोप" के कारण, मेरा मानना ​​है कि भविष्य में भी ऐसा कोई बयान नहीं होगा। के बीच एक और अलग object is typeऔर object instanceof classयह बात नहीं है एक सादे वस्तु या एक वर्ग का एक उदाहरण,: यह केवल बजाय जहां एक वस्तु से आकार मिला की "आकार" परवाह करता है, कि, टाइपप्रति में टाइप संरचनात्मक है।
vilicvane

2
बस एक गलत धारणा को साफ करने के लिए यह उत्तर बना सकता है: रनटाइम के दौरान ऑब्जेक्ट प्रकार या उसके इंटरफ़ेस को घटाने के लिए कोई मेटा जानकारी नहीं है।
ज्यादा

@ASTruash Yep, उत्तर का दूसरा भाग रनटाइम पर काम नहीं करेगा भले ही वह संकलन करता हो।
trusktr

4
ओह, लेकिन, यह मानना ​​होगा कि रनटाइम के दौरान इन वस्तुओं को एक typeसंपत्ति के साथ बनाया गया होगा । उस मामले में यह काम करता है। यह उदाहरण इस तथ्य को नहीं दिखाता है।
trusktr

40

टाइपस्क्रिप्ट 2.0 में टैग किए गए यूनियन का परिचय होता है

टाइपस्क्रिप्ट 2.0 सुविधाएँ

interface Square {
    kind: "square";
    size: number;
}

interface Rectangle {
    kind: "rectangle";
    width: number;
    height: number;
}

interface Circle {
    kind: "circle";
    radius: number;
}

type Shape = Square | Rectangle | Circle;

function area(s: Shape) {
    // In the following switch statement, the type of s is narrowed in each case clause
    // according to the value of the discriminant property, thus allowing the other properties
    // of that variant to be accessed without a type assertion.
    switch (s.kind) {
        case "square": return s.size * s.size;
        case "rectangle": return s.width * s.height;
        case "circle": return Math.PI * s.radius * s.radius;
    }
}

मैं 2.0 बीटा का उपयोग कर रहा हूं, लेकिन टैग किया गया संघ काम नहीं करता है। <TypeScriptToolsVersion> 2.0 </ TypeScriptToolsVersion>
Makla

रात के निर्माण के साथ संकलित, लेकिन इंटेलीजेंस काम नहीं करता है। यह भी त्रुटियों की सूची: संपत्ति की चौड़ाई / आकार / ... प्रकार 'स्क्वायर पर मौजूद नहीं है आयत | मामले के बयान में चक्र। लेकिन यह संकलन करता है।
मकाला

23
यह वास्तव में सिर्फ एक भेदभावकर्ता का उपयोग कर रहा है।
एरिक फिलिप्स

33

उपयोगकर्ता-परिभाषित प्रकार के गार्ड के बारे में कैसे? https://www.typescriptlang.org/docs/handbook/advanced-types.html

interface Bird {
    fly();
    layEggs();
}

interface Fish {
    swim();
    layEggs();
}

function isFish(pet: Fish | Bird): pet is Fish { //magic happens here
    return (<Fish>pet).swim !== undefined;
}

// Both calls to 'swim' and 'fly' are now okay.

if (isFish(pet)) {
    pet.swim();
}
else {
    pet.fly();
}

3
यह मेरा पसंदीदा उत्तर है - stackoverflow.com/a/33733258/469777 के समान लेकिन बिना जादू के तार जो कि मिनिमेशन जैसी चीजों के कारण टूट सकता है।
स्टैफ़र्ड विलियम्स

1
यह मेरे लिए किसी कारण से काम नहीं (pet as Fish).swim !== undefined;आया बल्कि किया।
साइबरएमयू

18

यह अब संभव है, मैंने अभी TypeScriptसंकलक का एक बढ़ाया संस्करण जारी किया है जो पूर्ण प्रतिबिंब क्षमताओं को प्रदान करता है। आप कक्षाओं को उनकी मेटाडेटा ऑब्जेक्ट्स से तुरंत हटा सकते हैं, क्लास कंस्ट्रक्टरों से मेटाडेटा प्राप्त कर सकते हैं और रनटाइम पर इंटरफ़ेस / कक्षाओं का निरीक्षण कर सकते हैं। आप इसे यहां देख सकते हैं

उपयोग उदाहरण:

आपकी किसी टाइपस्क्रिप्ट फ़ाइल में, एक इंटरफ़ेस और एक वर्ग बनाएं जो इसे निम्नलिखित की तरह लागू करता है:

interface MyInterface {
    doSomething(what: string): number;
}

class MyClass implements MyInterface {
    counter = 0;

    doSomething(what: string): number {
        console.log('Doing ' + what);
        return this.counter++;
    }
}

अब लागू इंटरफेस की कुछ सूची प्रिंट करते हैं।

for (let classInterface of MyClass.getClass().implements) {
    console.log('Implemented interface: ' + classInterface.name)
}

Reflec-ts के साथ संकलित करें और इसे लॉन्च करें:

$ node main.js
Implemented interface: MyInterface
Member name: counter - member kind: number
Member name: doSomething - member kind: function

Interfaceमेटा-प्रकार के विवरण के लिए रिफ्लेक्ट ..dts देखें।

अद्यतन: आप यहाँ एक पूर्ण कार्य उदाहरण पा सकते हैं


8
डाउनवॉटेड कॉस मुझे लगा कि यह बेवकूफी है, लेकिन फिर एक सेकंड के लिए रुक गया, अपने गिथब पृष्ठ को देखा और देखा कि इसे आज तक रखा गया है और इसके बजाय इतनी अच्छी तरह से प्रलेखित किया गया है :-) मैं अभी भी इसका उपयोग करने का औचित्य नहीं बता सकता। implementsलेकिन आपकी प्रतिबद्धता को पहचानना चाहता था और इसका मतलब :-) नहीं चाहता
सिमोन_विवर

5
दरअसल, इस प्रतिबिंब विशेषताओं को देखने का मुख्य उद्देश्य यह है कि जावा दुनिया में पहले से ही लंबे समय के बाद लोगों की तरह बेहतर आईओसी ढांचा तैयार किया जा सके (वसंत पहले और सबसे महत्वपूर्ण है)। मेरा दृढ़ विश्वास है कि टाइपस्क्रिप्ट भविष्य के सर्वोत्तम विकास साधनों में से एक बन सकता है और प्रतिबिंब उन विशेषताओं में से एक है जिनकी वास्तव में आवश्यकता है।
पैंस

5
... उह, तो क्या, हमें इन संकलक "संवर्द्धन" को भविष्य के किसी भी प्रकार के टाइपस्क्रिप्ट में रोल करना होगा? यह प्रभावी रूप से टाइपस्क्रिप्ट का एक कांटा है, टाइपस्क्रिप्ट ही नहीं, सही? यदि हां, तो यह एक संभव दीर्घकालिक समाधान नहीं है।
दुवदद

1
कई अन्य विषयों में @dudewad ने कहा, यह एक अस्थायी समाधान है। हम ट्रांसफॉर्मर के माध्यम से संकलक प्रतीक्षा कर रहे हैं। कृपया संबंधित प्रकार को आधिकारिक टाइपस्क्रिप्ट रेपो में देखें। इसके अलावा, सभी व्यापक रूप से अपनाई गई मजबूत-टाइप की गई भाषाओं में प्रतिबिंब होता है, और मुझे लगता है कि टाइपस्क्रिप्ट में भी यह होना चाहिए। और मेरी तरह, कई अन्य उपयोगकर्ता ऐसा सोचते हैं।
पैंक

हाँ, यह नहीं है कि मैं सहमत नहीं हूँ - मैं भी यही चाहता हूँ। बस, एक कस्टम कंपाइलर को कताई ... यह नहीं है कि टाइपस्क्रिप्ट के अगले पैच को पोर्ट करने की आवश्यकता है? यदि आप इसे बनाए रखते हैं तो यश। बहुत काम की तरह लगता है। इसे खटखटाया नहीं।
दुवदद d

10

उपर्युक्त के समान जहां उपयोगकर्ता-परिभाषित गार्ड का उपयोग किया गया था, लेकिन इस बार एक तीर फ़ंक्शन के साथ विधेय

interface A {
  member:string;
}

const check = (p: any): p is A => p.hasOwnProperty('member');

var foo: any = { member: "foobar" };
if (check(foo))
    alert(foo.member);

8

यहाँ एक और विकल्प है: मॉड्यूल ts-interface-builder एक बिल्ड-टाइम टूल प्रदान करता है जो टाइपस्क्रिप्ट इंटरफ़ेस को रनटाइम डिस्क्रिप्टर और ts- इंटरफ़ेस-चेकर में परिवर्तित करता है। जाँच सकता है कि क्या कोई ऑब्जेक्ट इसे संतुष्ट करता है।

ओपी के उदाहरण के लिए,

interface A {
  member: string;
}

आप पहले चलाएंगे, ts-interface-builderजो एक डिस्क्रिप्टर के साथ एक नई संक्षिप्त फ़ाइल तैयार करता है, कहते हैं foo-ti.ts, जिसे आप इस तरह से उपयोग कर सकते हैं:

import fooDesc from './foo-ti.ts';
import {createCheckers} from "ts-interface-checker";
const {A} = createCheckers(fooDesc);

A.check({member: "hello"});           // OK
A.check({member: 17});                // Fails with ".member is not a string" 

आप एक-लाइनर प्रकार-गार्ड फ़ंक्शन बना सकते हैं:

function isA(value: any): value is A { return A.test(value); }

6

मैं यह बताना चाहूंगा कि टाइपस्क्रिप्ट डायनेमिक रूप से परीक्षण के लिए एक प्रत्यक्ष तंत्र प्रदान नहीं करता है कि क्या कोई वस्तु किसी विशेष इंटरफ़ेस को लागू करती है।

इसके बजाय, टाइपस्क्रिप्ट कोड यह जांचने की जावास्क्रिप्ट तकनीक का उपयोग कर सकता है कि क्या सदस्यों का एक उपयुक्त समूह वस्तु पर मौजूद है। उदाहरण के लिए:

var obj : any = new Foo();

if (obj.someInterfaceMethod) {
    ...
}

4
क्या होगा यदि आपके पास एक जटिल आकार है? आप गहराई के प्रत्येक स्तर पर हर एक संपत्ति को हार्डकोड नहीं करना चाहेंगे
टॉम

@ मुझे लगता है कि आप पास कर सकते हैं (चेकर फ़ंक्शन के दूसरे पैरामीटर के रूप में) एक रन-टाइम वैल्यू या उदाहरण / एग्जाम्पलर - यानी इंटरफ़ेस का एक ऑब्जेक्ट जो आप चाहते हैं। फिर, हार्ड-कोडिंग कोड के बजाय, आप उस इंटरफ़ेस का कोई भी उदाहरण लिखते हैं जो आप चाहते हैं ... और कुछ एक-बार ऑब्जेक्ट-तुलना कोड (जैसे का उपयोग करके for (element in obj) {}) यह सत्यापित करने के लिए लिखें कि दोनों वस्तुओं में समान प्रकार के समान तत्व हैं।
क्रिसडब्ल्यू

5

TypeGuards

interface MyInterfaced {
    x: number
}

function isMyInterfaced(arg: any): arg is MyInterfaced {
    return arg.x !== undefined;
}

if (isMyInterfaced(obj)) {
    (obj as MyInterfaced ).x;
}

2
"arg MyInterfaced" एक दिलचस्प एनोटेशन है। यदि वह विफल हो जाता है तो क्या होता है? एक संकलन समय इंटरफ़ेस की तरह दिखता है - जो सिर्फ वही होगा जो मैं पहले स्थान पर चाहता था। लेकिन अगर कंपाइलर मापदंडों की जांच करता है, तो एक फ़ंक्शन बॉडी क्यों है। और अगर इस तरह की जांच संभव है, तो इसे एक अलग फ़ंक्शन में क्यों ले जाएं।
lhk

1
@lhk सिर्फ टाइप गार्ड के बारे में टाइपस्क्रिप्ट प्रलेखन पढ़ें ... typescriptlang.org/docs/handbook/advanced-types.html
दिमित्री

3

फेंटन के जवाब के आधार पर , यह देखने के लिए कि किसी दिए गए objectकीज़ के interfaceपास पूरी तरह से या आंशिक रूप से दोनों हैं, यह सत्यापित करने के लिए फ़ंक्शन का मेरा कार्यान्वयन है ।

आपके उपयोग के मामले के आधार पर, आपको इंटरफ़ेस के प्रत्येक गुण के प्रकार की जांच करने की आवश्यकता हो सकती है। नीचे दिया गया कोड ऐसा नहीं करता है।

function implementsTKeys<T>(obj: any, keys: (keyof T)[]): obj is T {
    if (!obj || !Array.isArray(keys)) {
        return false;
    }

    const implementKeys = keys.reduce((impl, key) => impl && key in obj, true);

    return implementKeys;
}

उपयोग का उदाहरण:

interface A {
    propOfA: string;
    methodOfA: Function;
}

let objectA: any = { propOfA: '' };

// Check if objectA partially implements A
let implementsA = implementsTKeys<A>(objectA, ['propOfA']);

console.log(implementsA); // true

objectA.methodOfA = () => true;

// Check if objectA fully implements A
implementsA = implementsTKeys<A>(objectA, ['propOfA', 'methodOfA']);

console.log(implementsA); // true

objectA = {};

// Check again if objectA fully implements A
implementsA = implementsTKeys<A>(objectA, ['propOfA', 'methodOfA']);

console.log(implementsA); // false, as objectA now is an empty object

2
export interface ConfSteps {
    group: string;
    key: string;
    steps: string[];
}
private verify(): void {
    const obj = `{
      "group": "group",
      "key": "key",
      "steps": [],
      "stepsPlus": []
    } `;
    if (this.implementsObject<ConfSteps>(obj, ['group', 'key', 'steps'])) {
      console.log(`Implements ConfSteps: ${obj}`);
    }
  }
private objProperties: Array<string> = [];

private implementsObject<T>(obj: any, keys: (keyof T)[]): boolean {
    JSON.parse(JSON.stringify(obj), (key, value) => {
      this.objProperties.push(key);
    });
    for (const key of keys) {
      if (!this.objProperties.includes(key.toString())) {
        return false;
      }
    }
    this.objProperties = null;
    return true;
  }

1
हालांकि यह कोड प्रश्न का उत्तर दे सकता है, लेकिन यह कोड क्यों और / या इस प्रश्न के उत्तर के बारे में अतिरिक्त संदर्भ प्रदान करता है, इसके दीर्घकालिक मूल्य में सुधार करता है।
xiawi

0

चूँकि प्रकार रन-टाइम में अज्ञात है, इसलिए मैंने अज्ञात ऑब्जेक्ट की तुलना करने के लिए कोड इस प्रकार लिखा था, न कि किसी प्रकार के विरुद्ध, लेकिन ज्ञात प्रकार की वस्तु के विरुद्ध:

  1. सही प्रकार का एक नमूना ऑब्जेक्ट बनाएं
  2. निर्दिष्ट करें कि इसके कौन से तत्व वैकल्पिक हैं
  3. इस नमूना वस्तु के खिलाफ अपनी अज्ञात वस्तु की गहरी तुलना करें

यहाँ मैं (इंटरफ़ेस-अज्ञेयवादी) कोड का उपयोग करता हूँ जिसकी गहरी तुलना की जाती है:

function assertTypeT<T>(loaded: any, wanted: T, optional?: Set<string>): T {
  // this is called recursively to compare each element
  function assertType(found: any, wanted: any, keyNames?: string): void {
    if (typeof wanted !== typeof found) {
      throw new Error(`assertType expected ${typeof wanted} but found ${typeof found}`);
    }
    switch (typeof wanted) {
      case "boolean":
      case "number":
      case "string":
        return; // primitive value type -- done checking
      case "object":
        break; // more to check
      case "undefined":
      case "symbol":
      case "function":
      default:
        throw new Error(`assertType does not support ${typeof wanted}`);
    }
    if (Array.isArray(wanted)) {
      if (!Array.isArray(found)) {
        throw new Error(`assertType expected an array but found ${found}`);
      }
      if (wanted.length === 1) {
        // assume we want a homogenous array with all elements the same type
        for (const element of found) {
          assertType(element, wanted[0]);
        }
      } else {
        // assume we want a tuple
        if (found.length !== wanted.length) {
          throw new Error(
            `assertType expected tuple length ${wanted.length} found ${found.length}`);
        }
        for (let i = 0; i < wanted.length; ++i) {
          assertType(found[i], wanted[i]);
        }
      }
      return;
    }
    for (const key in wanted) {
      const expectedKey = keyNames ? keyNames + "." + key : key;
      if (typeof found[key] === 'undefined') {
        if (!optional || !optional.has(expectedKey)) {
          throw new Error(`assertType expected key ${expectedKey}`);
        }
      } else {
        assertType(found[key], wanted[key], expectedKey);
      }
    }
  }

  assertType(loaded, wanted);
  return loaded as T;
}

नीचे एक उदाहरण है कि मैं इसका उपयोग कैसे करता हूं।

इस उदाहरण में, मुझे उम्मीद है कि JSON में टुपल्स की एक सरणी है, जिनमें से दूसरा तत्व एक इंटरफ़ेस का एक उदाहरण है User (जिसे दो वैकल्पिक तत्व हैं)।

टाइपस्क्रिप्ट की टाइप-चेकिंग यह सुनिश्चित करेगी कि मेरा नमूना ऑब्जेक्ट सही है, फिर assertTypeT फ़ंक्शन जाँचता है कि अज्ञात (JSON से लोड) ऑब्जेक्ट नमूना ऑब्जेक्ट से मेल खाता है।

export function loadUsers(): Map<number, User> {
  const found = require("./users.json");
  const sample: [number, User] = [
    49942,
    {
      "name": "ChrisW",
      "email": "example@example.com",
      "gravatarHash": "75bfdecf63c3495489123fe9c0b833e1",
      "profile": {
        "location": "Normandy",
        "aboutMe": "I wrote this!\n\nFurther details are to be supplied ..."
      },
      "favourites": []
    }
  ];
  const optional: Set<string> = new Set<string>(["profile.aboutMe", "profile.location"]);
  const loaded: [number, User][] = assertTypeT(found, [sample], optional);
  return new Map<number, User>(loaded);
}

आप उपयोगकर्ता-परिभाषित प्रकार के गार्ड के कार्यान्वयन में इस तरह से एक चेक लगा सकते हैं।


0

आप ts-validate-type का उपयोग करके रनटाइम में एक टाइपस्क्रिप्ट प्रकार को मान्य कर सकते हैं , जैसे कि (हालांकि एक कोलाहल प्लगइन की आवश्यकता होती है):

const user = validateType<{ name: string }>(data);
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.