@@ -251,11 +251,22 @@ export class TSHelper {
251251 }
252252 }
253253
254- public static hasGetAccessor ( node : ts . Node , checker : ts . TypeChecker ) : boolean {
254+ public static typeHasGetAccessor ( type : ts . Type , name : ts . __String , checker : ts . TypeChecker ) : boolean | undefined {
255+ if ( type . isUnion ( ) ) {
256+ if ( type . types . some ( t => this . typeHasGetAccessor ( t , name , checker ) ) ) {
257+ // undefined if only a subset of types implements the accessor
258+ return type . types . every ( t => this . typeHasGetAccessor ( t , name , checker ) ) ? true : undefined ;
259+ }
260+ return false ;
261+ }
262+ return this . forTypeOrAnySupertype ( type , checker , t => this . hasExplicitGetAccessor ( t , name ) ) ;
263+ }
264+
265+ public static hasGetAccessor ( node : ts . Node , checker : ts . TypeChecker ) : boolean | undefined {
255266 if ( ts . isPropertyAccessExpression ( node ) ) {
256267 const name = node . name . escapedText ;
257268 const type = checker . getTypeAtLocation ( node . expression ) ;
258- return this . forTypeOrAnySupertype ( type , checker , t => this . hasExplicitGetAccessor ( t , name ) ) ;
269+ return this . typeHasGetAccessor ( type , name , checker ) ;
259270 }
260271 return false ;
261272 }
@@ -267,11 +278,22 @@ export class TSHelper {
267278 }
268279 }
269280
281+ public static typeHasSetAccessor ( type : ts . Type , name : ts . __String , checker : ts . TypeChecker ) : boolean | undefined {
282+ if ( type . isUnion ( ) ) {
283+ if ( type . types . some ( t => this . typeHasSetAccessor ( t , name , checker ) ) ) {
284+ // undefined if only a subset of types implements the accessor
285+ return type . types . every ( t => this . typeHasSetAccessor ( t , name , checker ) ) ? true : undefined ;
286+ }
287+ return false ;
288+ }
289+ return this . forTypeOrAnySupertype ( type , checker , t => this . hasExplicitSetAccessor ( t , name ) ) ;
290+ }
291+
270292 public static hasSetAccessor ( node : ts . Node , checker : ts . TypeChecker ) : boolean {
271293 if ( ts . isPropertyAccessExpression ( node ) ) {
272294 const name = node . name . escapedText ;
273295 const type = checker . getTypeAtLocation ( node . expression ) ;
274- return this . forTypeOrAnySupertype ( type , checker , t => this . hasExplicitSetAccessor ( t , name ) ) ;
296+ return this . typeHasSetAccessor ( type , name , checker ) ;
275297 }
276298 return false ;
277299 }
0 commit comments