michaelolof / typescript-mix Goto Github PK
View Code? Open in Web Editor NEWA tweaked implementation of TypeScript's default applyMixins(...) idea using ES7 decorators
Home Page: https://www.npmjs.com/package/typescript-mix
A tweaked implementation of TypeScript's default applyMixins(...) idea using ES7 decorators
Home Page: https://www.npmjs.com/package/typescript-mix
ERROR in D:/git/aca-stages/src/components/InternshipsSchedule.vue(994,4):
994:4 This expression is not callable.
Type 'typeof import("D:/git/aca-stages/node_modules/typescript-mix/dist/index")' has no call signatures.
992 | })
993 | export default class InternshipsSchedule extends Vue {
> 994 | @use( stepsMixin ) (this as any)
| ^
995 |
996 | dataLevelsIsLoading = false
997 |
Version: typescript 3.9.7
Time: 780ms
When I use code from the example it throws me an error on this statement: [ts] Member 'this' implicitly has an 'any' type
class Shopperholic {
@use( Buyer, Transportable ) this
price = 2000;
distance = 140;
}
I have made the "noImplicitAny": false in tsconfig and all is ok but wonder - is it a valid behaviour?
I think it would kind off make more sense for the @use decorator to be applied on classes instead of a property 'this:any'.
So for example:
class Mixable {}
@use(Mixable)
class Mixed {}
interface Mixed extends Mixable {}
This looks really cool! Can I use this without decorators? I'm using sucrase for fast builds, but it doesn't support decorators (since it's not fully standardized).
Is it possible to define the mixin under a different key space?
class Main {
@use(OtherClass, 'other') this;
}
such that
const m = new Main();
m.other.*
I just started using this library today. I love it so far. Thanks for maintaining it.
From what I can tell, typescript getters don't work with mixins (at least in my specific case). Here is an example I am trying to get to work.
class EmployableMixin {
config: any;
get companyId(): string {
return this.config.companyId; // TypeError: Cannot read property 'companyId' of undefined
}
}
class Employee {
@use(EmployableMixin)
config: any;
constructor(config) {
this.config = config;
}
}
const employee = new Employee({companyId: '12345'});
console.log(employee.companyId) // error
However, if I edit the mixin to use a regular function rather than a getter, the error goes away:
class EmployableMixin {
config: any;
getCompanyId(): string {
return this.config.companyId; // no error
}
}
class Employee {
@use(EmployableMixin)
config: any;
constructor(config) {
this.config = config;
}
}
const employee = new Employee({companyId: '12345'});
console.log(employee.getCompanyId()) // 12345
I realize I'm probably doing something unconventional by trying to access the config
object in the mixin class. But if it works with a regular function I feel like it should work with a getter as well. Do you know if this would be possible to fix? I'm happy to help out with a pull request. I just wanted to get your thoughts first.
Suppose we have four classes: A. B, C and B0:
class A { }
class B0 { }
class B extends B0 { }
class C {
@use(A, B) this;
constructor() {
A.call(this);
B.call(this);
}
}
So, in this case getters/setters of B0 will be undefined for C.
See detailed example here: https://stackblitz.com/edit/typescript-utvbsh
Any reason we can't mixin boolean properties? Thanks!
p.s. Great library - the best I've found for TypeScript that has Intellisense working nicely!
Great work here, very simple intuitive API.
I read on your medium article that it would be easy to test mixins to by instantiating them.
Would you be able to push any examples tests inside an example folder in this repo, or would you be able to share a code-snippet as it would be very useful.
I hope to share your work with others and introduce them to this great concept.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
๐ Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. ๐๐๐
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google โค๏ธ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.