Skip to content

Component 不能往 this 上加自定义属性 #133

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
1728317209 opened this issue May 29, 2020 · 19 comments
Closed

Component 不能往 this 上加自定义属性 #133

1728317209 opened this issue May 29, 2020 · 19 comments

Comments

@1728317209
Copy link

1728317209 commented May 29, 2020

Page 可以往 this 上加自定义属性,Component 不可以,能支持吗?

interface TData {
  name: string;
}

interface TProperty {
  [key: string]: WechatMiniprogram.Component.AllProperty;
  id: NumberConstructor;
}

interface TMethod {
  [key: string]: (...args: any[]) => any;
  setJob: (job: string) => void;
}

Component<TData, TProperty, TMethod>({
  properties: {
    id: Number,
  },

  data: {
    name: '',
  },

  methods: {
    setJob(job) {
      this.job = job; // 不能将类型“string”分配给类型“(...args: any[]) => any”。
    },
  },
});
interface TData {
  id: number;
  name: string;
}

interface TCustom {
  job: string;
  setJob: (job: string) => void;
}

Page<TData, TCustom>({
  data: {
    id: 0,
    name: '',
  },

  job: '',

  setJob(job) {
    this.job = job;
  },
});
@Mister-Hope
Copy link
Contributor

官方是不支持的,但是你可以在构造器前声明一个对象,在那里存储。

@1728317209
Copy link
Author

1728317209 commented May 30, 2020

官方是不支持的,但是你可以在构造器前声明一个对象,在那里存储。

🙏

你的意思是这样嘛👇,在 global.d.ts 里这样写,我试了下是可以的。

image

但是会有 lib.wx.component.d.ts(25, 14): 'Instance' was also declared here. 这样标识符重复的报错,这样没关系吗?

@Mister-Hope
Copy link
Contributor

Mister-Hope commented May 30, 2020 via email

@1728317209
Copy link
Author

1728317209 commented Jun 2, 2020

这样的话,这些就没有了吧👇

截屏2020-06-02 下午4 35 00

@SgLy
Copy link
Member

SgLy commented Jun 2, 2020

Component 是不能像 Page 一样在构造参数顶层加自定义参数的,就

Component({
  test: 1,
  methods: {
    fn() {
      this.test // undefined
    }
  }
})

要挂自定义参数只能直接 this.test=1 这样去操作,当时写定义的时候一是这个推导比较难做,二是以为应该很少会有人这样去用,所以没有专门给它留一个泛型位置。有比较具体的使用情景可以一起看一下吗?

@1728317209
Copy link
Author

我们项目里面,一般渲染层用不到的数据,都是 this.xxx 或 this.state.xxx,渲染层用到的数据,才会放到 data 里

@Mister-Hope
Copy link
Contributor

Mister-Hope commented Jun 2, 2020 via email

@1728317209
Copy link
Author

1728317209 commented Jun 2, 2020

在第一行 const state = {},这个 state 是所有组件公共的 state

如果 <list-item /> 组件,就一定要用 this 了

目前就想到这一种情况...

@SgLy
Copy link
Member

SgLy commented Jun 2, 2020

那我正好来推销一下 纯数据字段

不过话说回来,往自定义组件实例上挂属性既然是可以的,应该还是得想办法支持。下个版本看看加一个泛型 mixin 到实例上解决这个问题吧

@Mister-Hope
Copy link
Contributor

Mister-Hope commented Jun 2, 2020

那我正好来推销一下 纯数据字段

不过话说回来,往自定义组件实例上挂属性既然是可以的,应该还是得想办法支持。下个版本看看加一个泛型 mixin 到实例上解决这个问题吧

2.8.2劝退了😂

@1728317209
Copy link
Author

感谢🙏

@1728317209
Copy link
Author

我们基础库还是 1.9.4 😂

@Mister-Hope
Copy link
Contributor

Mister-Hope commented Jun 2, 2020

我们基础库还是 1.9.4 😂

我基础库2.5.2我觉得已经很高了

@SgLy
Copy link
Member

SgLy commented Jun 3, 2020

2.8.3 以上都已经 98% 了呀😂

@SgLy
Copy link
Member

SgLy commented Jun 15, 2020

@SgLy
Copy link
Member

SgLy commented Jun 19, 2020

暂且先关闭了,如果有问题再重新打开吧

@SgLy SgLy closed this as completed Jun 19, 2020
@melcurve
Copy link

melcurve commented Oct 20, 2023

已经在新版本里加上了,用例:https://github.com/wechat-miniprogram/api-typings/blob/1ae404c/test/issue.test.ts#L277-L307

请问如何给properties中的参数提供默认值呢?我想用比如
job: { type:Number, value:0 }
这种写法,在IProperty中应该如何定义呢?

@AlphaCodeZero
Copy link

已经在新版本里加上了,用例:https://github.com/wechat-miniprogram/api-typings/blob/1ae404c/test/issue.test.ts#L277-L307

这是啥解决方案啊,本来 IData, IProperty, IMethod 是能自动推导的,现在为了声明 ICustomInstanceProperty,前面几个泛型也得声明了,你们弄了这个方案后自己实际用过吗?不觉得别扭吗。。。

@SgLy
Copy link
Member

SgLy commented Mar 4, 2025

这是啥解决方案啊,本来 IData, IProperty, IMethod 是能自动推导的,现在为了声明 ICustomInstanceProperty,前面几个泛型也得声明了,你们弄了这个方案后自己实际用过吗?不觉得别扭吗。。。

确实是很别扭,主要是基于这些原因:

  1. 小程序基础库是覆盖式发布,小程序不能自己决定使用哪个版本的基础库,因此框架相关的接口必须保持稳定,不能做破坏性改动;
  2. 基于第一点,类型定义只能去描述现有接口,不能为了方便推导或者易用而改变实际的接口形式和参数,因为破坏性的改动无法落实到实际实现上;
  3. 自定义属性目前通过 this.prop = x 挂载,这个无法推导,只能传入;在第二点的基础上,要维持原有泛型自动推导只能让同一个函数的多个泛型部分传入、部分推导,而这个特性目前 TypeScript 还没法实现(Proposal: Partial Type Argument Inference microsoft/TypeScript#26242

目前这套框架接口因为设计的时间比较早,那时候 TS 相对来说不像现在这么流行,因此接口对 TS 并不太友好;现在这套方案是考虑以上限制下能解决问题的一种方案,但是由于我水平有限,确实很别扭;如果有更好的方案也欢迎提出,可以再改进这份定义

我们这两年重新设计的新版框架接口中有考虑这个用法了(wechat-miniprogram/glass-easel#70),这份定义后面也会补上链式调用的支持(#315

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

5 participants