@@ -268,11 +268,22 @@ export class TSHelper {
268268 }
269269 }
270270
271- public static hasGetAccessor ( node : ts . Node , checker : ts . TypeChecker ) : boolean {
271+ public static typeHasGetAccessor ( type : ts . Type , name : ts . __String , checker : ts . TypeChecker ) : boolean | undefined {
272+ if ( type . isUnion ( ) ) {
273+ if ( type . types . some ( t => this . typeHasGetAccessor ( t , name , checker ) ) ) {
274+ // undefined if only a subset of types implements the accessor
275+ return type . types . every ( t => this . typeHasGetAccessor ( t , name , checker ) ) ? true : undefined ;
276+ }
277+ return false ;
278+ }
279+ return this . forTypeOrAnySupertype ( type , checker , t => this . hasExplicitGetAccessor ( t , name ) ) ;
280+ }
281+
282+ public static hasGetAccessor ( node : ts . Node , checker : ts . TypeChecker ) : boolean | undefined {
272283 if ( ts . isPropertyAccessExpression ( node ) ) {
273284 const name = node . name . escapedText ;
274285 const type = checker . getTypeAtLocation ( node . expression ) ;
275- return this . forTypeOrAnySupertype ( type , checker , t => this . hasExplicitGetAccessor ( t , name ) ) ;
286+ return this . typeHasGetAccessor ( type , name , checker ) ;
276287 }
277288 return false ;
278289 }
@@ -284,11 +295,22 @@ export class TSHelper {
284295 }
285296 }
286297
298+ public static typeHasSetAccessor ( type : ts . Type , name : ts . __String , checker : ts . TypeChecker ) : boolean | undefined {
299+ if ( type . isUnion ( ) ) {
300+ if ( type . types . some ( t => this . typeHasSetAccessor ( t , name , checker ) ) ) {
301+ // undefined if only a subset of types implements the accessor
302+ return type . types . every ( t => this . typeHasSetAccessor ( t , name , checker ) ) ? true : undefined ;
303+ }
304+ return false ;
305+ }
306+ return this . forTypeOrAnySupertype ( type , checker , t => this . hasExplicitSetAccessor ( t , name ) ) ;
307+ }
308+
287309 public static hasSetAccessor ( node : ts . Node , checker : ts . TypeChecker ) : boolean {
288310 if ( ts . isPropertyAccessExpression ( node ) ) {
289311 const name = node . name . escapedText ;
290312 const type = checker . getTypeAtLocation ( node . expression ) ;
291- return this . forTypeOrAnySupertype ( type , checker , t => this . hasExplicitSetAccessor ( t , name ) ) ;
313+ return this . typeHasSetAccessor ( type , name , checker ) ;
292314 }
293315 return false ;
294316 }
0 commit comments