microsoft / microsoft/TypeScript
Infer method name for parameter decorator
Chưa có ai nhận issue này.
- Ngôn ngữ chính
- Go
- Star
- 111k
- Fork
- 14.4k
- Merge trung bình
- 1 ngày 19 giờ
- Pull request đã merge (30 ngày)
- 117
Mô tả
TypeScript Version: 3.3.3
Tried with @next (3.4.0-dev.201xxxxx) ? NO
Search Terms: type:issues infer method name parameter decorator
Code
declare function Method():
{
(t: any, m: 'method'): void;
}
declare function Parameter():
{
(t: any, m: 'method', i: number): void;
}
class Play
{
@Method() // err
public another_method ( @Parameter() /* NO ERROR */ test: number ): void
{
throw new Error('Not yet implemented');
}
@Method()
public method ( @Parameter() test: number ): void
{
throw new Error('Not yet implemented');
}
}
Expected behavior: @Parameter() should error just as @Method() when applied to another_method() because the m parameter is typed "method" (which should reduced the set of method). i.e method name should be enforced.
Actual behavior: No error
Playground Link: https://typescript-play.js.org
Use case :
I crafted a type that filters method names with the nth parameters iff that parameters is of the given type T.
See KeysToTypedNthParameter definition here
let hash = {
a( _0: string, _1: string ) {},
b( _0: string, _1: number ) {},
c( _0: number, _1: number ) {},
d( _0: number, _1: string ) {},
}
let string_0: KeysToTypedNthParameter<0, string, typeof hash>; // "a" | "b"
let string_1: KeysToTypedNthParameter<1, string, typeof hash>; // "a" | "d"
let number_0: KeysToTypedNthParameter<0, number, typeof hash>; // "c" | "d"
let number_1: KeysToTypedNthParameter<1, number, typeof hash>; // "c" | "d"
Later, I used that type to infer method name for my parameter decorator - @Inject - in the excerpt below, I marked the ONLY line that should error and why (but both lines actually error)
class Test
{
public blatantly!: boolean;
}
class Play
{
public method(
@Inject({ type: Test })
@Inject({ type: Number }) // err (construtor mismatch instance type)
test: Test,
): void
{
throw new Error( 'Not yet implemented' );
}
}
Play;
Here is @Inject decorator definition and complete code -
const Inject: InjectLike = void 0 as unknown as InjectLike;
interface InjectLike
{
<
C extends ConstructorLike,
>
({}: { type: C }): {
<
// FIXME : not enough to infer the method name - see ./__playground.ts#
M extends ( T extends ConstructorLike ? never : KeysToTypedNthParameter<I, InstanceType<C>, T> ),
I extends number,
T,
>
( target: T, member: M, index: I ): void;
};
}
Hướng dẫn đóng góp
Bắt đầu từ đâu
- Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
- Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
- Fork repository và làm thay đổi trên một nhánh.
- Mở pull request có tham chiếu số hiệu của issue.
Hướng nghiên cứu
Bắt đầu bằng cách tái hiện các ví dụ decorator trong TypeScript Playground được liên kết, bao gồm định nghĩa InjectLike và tham chiếu của nó đến __playground.ts. Theo dõi cách tên phương thức generic, chỉ mục tham số và kiểu đích được suy luận; hoàn tất khi @Parameter() gây lỗi trên another_method(), trong khi cách sử dụng @Inject hợp lệ được chấp nhận và mismatch của constructor được đánh dấu bị từ chối.
Do mô hình lập chỉ mục viết ra từ nội dung của issue.
Đánh giá
- Công nghệ
- typescript
- Lĩnh vực
- compilers
- Loại issue
- Lỗi
- Độ khó
- 5/5
- Thời gian dự kiến
- Hơn một tuần
- Mức độ hoạt động
- Đình trệ
- Độ rõ ràng
- Khá rõ ràng
- Mức phù hợp với người mới
- 30/100