Vivasoft-logo

4.3 āĻœā§‡āύ⧇āϰāĻŋāĻ• āĻ•ā§āϞāĻžāϏ āĻ“ āĻāĻ•ā§āϏāĻŸā§‡āĻ¨ā§āĻĄāĻŋāĻ‚ āĻœā§‡āύ⧇āϰāĻŋāĻ• āĻ•ā§āϞāĻžāϏ

āĻœā§‡āύ⧇āϰāĻŋāĻ• āĻĢāĻžāĻ‚āĻļāύ āĻŦāĻž āχāĻ¨ā§āϟāĻžāϰāĻĢ⧇āϏ⧇āϰ āĻŽāϤāχ āĻāĻ•āϟāĻŋ āĻœā§‡āύ⧇āϰāĻŋāĻ• āĻ•ā§āϞāĻžāϏ⧇āϰ āύāĻžāĻŽā§‡āϰ āĻĒāϰ āĻāĻ™ā§āϗ⧇āϞ āĻŦā§āĻ°ā§āϝāĻžāϕ⧇āĻŸā§‡ (<>) āĻāĻ• āĻŦāĻž āϤāϤ⧋āϧāĻŋāĻ•Â  āϟāĻžāχāĻĒ āĻĒā§āϝāĻžāϰāĻžāĻŽāĻŋāϟāĻžāϰ āĻĄāĻŋāĻĢāĻžāχāύ āĻ•āϰāĻž āĻĨāĻžāϕ⧇āĨ¤ āĻœā§‡āύ⧇āϰāĻŋāĻ• āĻ•ā§āϞāĻžāϏ⧇āϰ āĻāĻ•āϟāĻŋ āωāĻĻāĻžāĻšāϰāύ āĻĻ⧇āϖ⧇ āĻ¨ā§‡ā§ŸāĻž āϝāĻžāĻ•:

				
					class GenericExample<NumType, StringType> {
  numberValue: NumType;
  stringValue: StringType;

   constructor(numberValue: NumType, stringValue: StringType) {
      this.numberValue = numberValue;
      this.stringValue = stringValue;
   }
}
				
			

āϞāĻ•ā§āώ āĻ•āϰ⧁āύ GenericExample āĻ•ā§āϞāĻžāĻ¸ā§‡Â  NumType āĻāĻŦāĻ‚ StringType āĻĻ⧁āχāϟāĻŋ  āĻœā§‡āύ⧇āϰāĻŋāĻ• āϟāĻžāχāĻĒ āĻĒā§āϝāĻžāϰāĻžāĻŽāĻŋāϟāĻžāϰ āĻŦā§āϝāĻŦāĻšāĻžāĻ°Â  āĻ•āϰāĻž āĻšā§Ÿā§‡āϛ⧇āĨ¤ āĻāχ āϟāĻžāχāĻĒ āĻĒā§āϝāĻžāϰāĻžāĻŽāĻŋāϟāĻžāϰ āĻĻ⧁āĻŸā§‹āϕ⧇ āĻ•ā§āϞāĻžāϏ⧇āϰ āĻ…āĻ¨ā§āϝāĻžāĻ¨ā§āϝ āĻĒā§āϰ⧋āĻĒāĻžāĻ°ā§āϟāĻŋ āĻāĻŦāĻ‚ āĻ•āĻ¨ā§āϏāĻŸā§āϰāĻžāĻ•ā§āϟāϰ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāϤ⧇ āĻĒāĻžāϰāĻŦ⧇āĨ¤ āĻ•ā§āϞāĻžāϏāϟāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāĻ°Â  āĻ•āϰāĻž āϝāĻžā§Ÿ āĻāĻ­āĻžāĻŦ⧇:

				
					let myGenericExample = new GenericExample<number, string>(0, 'Hello');

console.log(myGenericExample.numberValue); // prints 0
console.log(myGenericExample.stringValue); // prints 'Hello'
				
			

āĻāĻ–āĻžāύ⧇ āϟāĻžāχāĻĒ āĻĒā§āϝāĻžāϰāĻžāĻŽāĻŋāϟāĻžāϰ⧇āϰ āĻŽāĻžāĻ§ā§āϝāĻŽā§‡ number āĻāĻŦāĻ‚ string āϟāĻžāχāĻĒ āĻ¸ā§āĻĒ⧇āϏāĻŋāĻĢāĻžāχ āĻ•āϰ⧇ āĻĻā§‡ā§ŸāĻž āĻšā§Ÿā§‡āϛ⧇āĨ¤ āĻāĻŦāĻ‚ āĻ•ā§āϞāĻžāϏ āĻ•āĻ¨ā§āϏāĻŸā§āϰāĻžāĻ•ā§āϟāϰ⧇ āĻĻ⧁āχāϟāĻŋ āĻ­ā§āϝāĻžāϞ⧁ āφāĻ°ā§āϗ⧁āĻŽā§‡āĻ¨ā§āϟ āĻšāĻŋāϏ⧇āĻŦ⧇ āĻĒāĻžāĻ āĻžāύ⧋ āĻšā§Ÿā§‡āϛ⧇āĨ¤ āφāĻŽāϰāĻž āϜāĻžāύāĻŋ āϝ⧇ āφāĻ°ā§āϗ⧁āĻŽā§‡āĻ¨ā§āϟ āĻ āφāĻŽāϰāĻž āĻ“āχ āĻ¸ā§āĻĒ⧇āϏāĻŋāĻĢāĻŋāĻ• āϟāĻžāχāĻĒ⧇āϰ āĻ­ā§āϝāĻžāϞ⧁ āĻ›āĻžā§œāĻž āĻ…āĻ¨ā§āϝ āϕ⧋āύ āϟāĻžāχāĻĒ⧇āϰ āĻ­ā§āϝāĻžāϞ⧁ āĻŦā§āϝāĻŦāĻšāĻžāĻ°Â  āĻ•āϰāϤ⧇ āĻĒāĻžāϰāĻŦā§‹ āύāĻžāĨ¤Â 

āĻāĻ•ā§āϏāĻŸā§‡āĻ¨ā§āĻĄāĻŋāĻ‚ āĻœā§‡āύ⧇āϰāĻŋāĻ• āĻ•ā§āϞāĻžāϏ:

āφāĻŽāϰāĻž āĻœā§‡āύ⧇āϰāĻŋāĻ• āĻ•ā§āϞāĻžāϏ āĻāĻ•ā§āϏāĻŸā§‡āĻ¨ā§āĻĄ āĻ•āϰāĻžāϰ āĻŽāĻžāĻ§ā§āϝāĻŽā§‡ āĻ•ā§āϞāĻžāϏ⧇ āĻ•āĻŋāϛ⧁ āĻĢāĻŋāϚāĻžāϰ āϝ⧋āĻ— āĻ•āϰāϤ⧇ āĻĒāĻžāϰāĻŋāĨ¤ āĻāĻ•āϟāĻŋ āĻœā§‡āύ⧇āϰāĻŋāĻ• āĻ•ā§āϞāĻžāϏ āĻāĻ•ā§āϏāĻŸā§‡āĻ¨ā§āĻĄ āĻ…āĻĒāĻžāϰ⧇āϟāϰ⧇āϰ āĻŽāĻžāĻ§ā§āϝāĻŽā§‡ āĻāĻ•ā§āϏāĻŸā§‡āĻ¨ā§āĻĄ āĻ•āϰāĻž āϝāĻžā§Ÿ āĨ¤ āĻĒā§āϰāĻĨāĻŽā§‡ āĻāĻ•āϟāĻŋ āĻœā§‡āύ⧇āϰāĻŋāĻ• āĻ•ā§āϞāĻžāϏ āϤ⧈āϰāĻŋ āĻ•āϰāĻž āϝāĻžāĻ•: 

				
					interface Product {
  name: string;
  price: number;
}

class Store<T> {
  protected _object: T[] = [];
 
  add(obj: T): void {
    this._object.push(obj)
  }
}
				
			

āĻāĻ–āĻžāύ⧇ āĻ•ā§āϞāĻžāϏ⧇āϰ āϭ⧇āϤāϰ⧇ āĻāĻ•āϟāĻŋ āĻ…āĻŦāĻœā§‡āĻ•ā§āϟ āĻāĻŦāĻ‚ āĻāĻ•āϟāĻŋ āĻŽā§‡āĻĨāĻĄ āĻĄāĻŋāĻ•ā§āϞāĻžāϰ āĻ•āϰāĻž āĻšā§Ÿā§‡āϛ⧇ āϝāĻž T āϟāĻžāχāĻĒ⧇āϰ āĻ­ā§āϝāĻžāϞ⧁ āĻ…āĻŦāĻœā§‡āĻ•ā§āϟ āĻ āĻĒ⧁āĻļ āĻ•āϰāĻŦ⧇āĨ¤ āĻ…āĻŦāĻœā§‡āĻ•ā§āϟāϟāĻŋāϤ⧇ protected āĻ•āĻŋāĻ“ā§ŸāĻžāĻ°ā§āĻĄ āĻŦā§āϝāĻŦāĻšāĻžāĻ°Â  āĻ•āϰāĻž āĻšā§Ÿā§‡āϛ⧇ āϝ⧇āύ āĻāϰ āĻĒā§āϰ⧋āĻĒāĻžāĻ°ā§āϟāĻŋ āϏāĻžāĻŦāĻ•ā§āϞāĻžāϏ āĻĨ⧇āϕ⧇ āĻāĻ•ā§āϏ⧇āϏ āĻ•āϰāĻž āϝāĻžā§ŸāĨ¤

				
					class StoreSubclass<T> extends Store<T>{
    // StoreSubclass method here
}
				
			

āĻāĻ–āύ āϧāϰāĻž āϝāĻžāĻ• āφāĻŽāϰāĻž āĻāĻ•āϟāĻŋ āϏāĻžāĻŦāĻ•ā§āϞāĻžāϏ āĻĨ⧇āϕ⧇ āĻŦ⧇āϜāĻ•ā§āϞāĻžāϏ _object āĻāϰ āĻāϞāĻŋāĻŽā§‡āĻ¨ā§āϟ āĻāĻ•ā§āϏ⧇āϏ āĻ•āϰāϤ⧇ āϚāĻžāĻšā§āĻ›āĻŋāĨ¤ āĻāϟāĻŋ āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝ āĻāĻ•āϟāĻŋ āĻŽā§‡āĻĨāĻĄ āĻĄāĻŋāĻĢāĻžāχāύ āĻ•āϰāĻž āϝāĻžāĻ•āĨ¤

				
					class StoreSubclass1<T> extends Store<T> {
 findMethod(name: string): T | undefined {
    return this._object.find(obj => obj.name === name)
  }
  // Property 'name' does not exist on type 'T[]'.
}
				
			

āφāĻŽāϰāĻž āĻŽā§‡āĻĨāĻĄā§‡āϰ āϭ⧇āϤāϰ āĻĨ⧇āϕ⧇ āĻāĻ­āĻžāĻŦ⧇ āĻĄāϟ āύ⧋āĻŸā§‡āĻļāύ āĻŦā§āϝāĻŦāĻšāĻžāĻ°Â  āĻ•āϰ⧇ āĻ…āĻŦāĻœā§‡āĻ•ā§āϟ āĻāϰ āĻ­ā§āϝāĻžāϞ⧁ āĻāĻ•ā§āϏ⧇āϏ āĻ•āϰāϤ⧇ āĻĒāĻžāϰāĻŦā§‹ āύāĻžāĨ¤ āϏ⧇āĻ•ā§āώ⧇āĻ¤ā§āϰ⧇ āĻ•āĻŽā§āĻĒāĻžāχāϞ⧇āĻļāύ āĻāϰāϰ āĻĻ⧇āĻ–āĻžāĻŦ⧇āĨ¤ āϝ⧇āĻŽāύ: āĻāĻ–āĻžāύ⧇ āϏāĻžāĻŦāĻ•ā§āϞāĻžāϏ⧇āϰ āĻĒā§āϝāĻžāϰāĻžāĻŽāĻŋāϟāĻžāϰ <T> āϜāĻžāύ⧇ āύāĻž āĻ…āĻŦāĻœā§‡āĻ•ā§āϟ āĻ name āύāĻžāĻŽā§‡āϰ āĻĒā§āϰ⧋āĻĒāĻžāĻ°ā§āϟāĻŋ āφāϛ⧇āĨ¤ āϏ⧇āĻ•ā§āώ⧇āĻ¤ā§āϰ⧇ āφāĻŽāĻžāĻĻ⧇āϰ āϏāĻžāĻŦāĻ•ā§āϞāĻžāϏ⧇āϰ āĻĒā§āϝāĻžāϰāĻžāĻŽāĻŋāϟāĻžāϰ⧇ āĻ¸ā§āĻĒ⧇āϏāĻŋāĻĢāĻžāχ āĻ•āϰ⧇ āĻĻāĻŋāϤ⧇ āĻšāĻŦ⧇ āĻāĻ­āĻžāĻŦ⧇āĨ¤

				
					class StoreSubclass1<T extends { name: string }> extends Store<T>{
 findMethod(name: string): T | undefined {
    return this._object.find(obj => obj.name === name)
  }
}
				
			

āĻ…āĻ¨ā§āϝāĻĻāĻŋāϕ⧇ āφāĻŽāϰāĻž āϝāĻĻāĻŋ āϏāĻžāĻŦāĻ•ā§āϞāĻžāϏāϕ⧇ āĻœā§‡āύ⧇āϰāĻŋāĻ• āĻ•āϰāϤ⧇ āύāĻž āϚāĻžāχ āϤāĻžāĻšāϞ⧇ āĻœā§‡āύ⧇āϰāĻŋāĻ• āϟāĻžāχāĻĒ āĻĒā§āϝāĻžāϰāĻžāĻŽāĻŋāϟāĻžāϰ āĻĢāĻŋāĻ•ā§āϏ āĻ•āϰ⧇ āĻĻāĻŋāϤ⧇ āĻĒāĻžāϰāĻŦā§‹āĨ¤ āϝ⧇āĻŽāύ:

				
					class fixedStore extends Store<Product> {
  identity(category: string): Product[] {
    return [];
  }
}
				
			

āĻāĻ–āĻžāύ⧇ āĻŦ⧇āϜāĻ•ā§āϞāĻžāϏ āĻāϰ āϟāĻžāχāĻĒ āĻĒā§āϝāĻžāϰāĻžāĻŽāĻŋāϟāĻžāϰ āχāĻ¨ā§āϟāĻžāϰāĻĢ⧇āϏ āϟāĻžāχāĻĒ āĻĻā§āĻŦāĻžāϰāĻž āĻĢāĻŋāĻ•ā§āϏāĻĄ āĻ•āϰāĻžāĨ¤ āĻāĻ•āϟāĻŋ āĻœā§‡āύ⧇āϰāĻŋāĻ• āĻ•ā§āϞāĻžāϏ āĻāĻ•ā§āϏāĻŸā§‡āĻ¨ā§āĻĄ āĻ•āϰāĻžāϰ āĻŽāĻžāĻ§ā§āϝāĻŽā§‡ āφāĻŽāϰāĻž āĻāχāϰāĻ•āĻŽ āĻĢāĻŋāϚāĻžāϰ āϗ⧁āϞ⧋ āĻāĻ•ā§āϏāĻĒā§āϞ⧋āϰ āĻ•āϰāϤ⧇ āĻĒāĻžāϰāĻŋāĨ¤