microsoft / microsoft/TypeScript
Prototype assignment should take the type of the initializer and not require a literal
还没有人认领这个 Issue。
- 主要语言
- Go
- 星标
- 111k
- 派生
- 14.4k
- 平均合并
- 1 天 19 小时
- 30 天内合并 PR
- 117
描述
This is a feature request based on actual VS customer code.
TypeScript Version: 3.9.2
Search Terms: ES5 class javascript prototype assignment constructor function
Expected behavior: In the example below, the prototype for test.class should include properties from testPrototype.
Actual behavior: Per @sandersn this pattern is recognized in the binder and only uses syntactic information, therefore does not use the type information from testPrototype .
Related Issues: #39167 from same user code. Also #33454 maybe?
Code
var test = {};
test.testPrototype = {
add: function (i) {
}
}
test.class = function (name) {
function getName() {
return name;
}
this.name = getName();
}
test.class.prototype = test.testPrototype;
var t = new test.class("test");
t.name
t.add // EXPECTED: Binds to `add` from the prototype, ACTUAL: doesn't
//
// Same pattern works when a literal is assigned to the prototype:
//
var test2 = {};
test2.class = function (name) {
function getName() {
return name;
}
this.name = getName();
}
// replaced `test.testPrototype` with a literal
test2.class.prototype = {
add: function (i) {
}
};
var t2 = new test2.class("test");
t2.name
t2.add // ACTUAL: `add` bound correctly
Compiler Options
{
"compilerOptions": {
"noImplicitAny": true,
"strictFunctionTypes": true,
"strictPropertyInitialization": true,
"strictBindCallApply": true,
"noImplicitThis": true,
"noImplicitReturns": true,
"alwaysStrict": true,
"esModuleInterop": true,
"checkJs": true,
"allowJs": true,
"declaration": true,
"experimentalDecorators": true,
"emitDecoratorMetadata": true,
"moduleResolution": 2,
"target": "ES2017",
"jsx": "React",
"module": "ESNext"
}
}
Playground Link: Provided
贡献指南
从这里开始
- 先读完整个 Issue,再读项目的贡献指南。
- 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
- Fork 仓库,在一个分支上完成修改。
- 提交 Pull Request,并在描述里引用这个 Issue 编号。
调研方向
从提供的 TypeScript Playground 重现和 issue 中描述的 binder 行为开始,比较对象字面量的原型赋值与来自 test.testPrototype 的赋值。当初始化器的类型提供原型属性,使示例中的 t.add 能够被识别,同时现有的字面量情况继续正常工作时,工作就完成了。
由索引模型根据 Issue 内容生成。
评估
- 技术栈
- javascript, typescript
- 领域
- compilers
- Issue 类型
- 功能
- 难度
- 4/5
- 预计耗时
- 3-5 天
- 活跃度
- 停滞
- 描述清晰度
- 基本清楚
- 新手友好度
- 35/100