Typescript에서 대리자 형식 선언
C # 배경에서 왔기 때문에 함수 서명을 정의하는 데이터 유형을 만들고 싶습니다. C #에서는 다음 delegate
과 같이 선언됩니다.
delegate void Greeter (string message);
public class Foo
{
public void SayHi (Greeter g) {
g("Hi!");
}
}
이제 Typescript에서 비슷한 결과를 얻고 싶습니다. Typescript에는 대리자 유형이 없지만 람다 만 있다는 것을 알고 있습니다. 나는 다음과 같은 것을 생각 해냈다.
class Foo {
SayHi (greeter: (msg: String) => void) {
greeter('Hi!');
}
}
이것이 작동하는 동안 메서드 서명을 (msg:String) => void
두 번 재사용하고 C #의 대리자처럼 사용자 지정 형식을 만드는 것이 더 깔끔 할 것이라고 생각합니다.
이것이 어떻게 할 수 있는지 아이디어가 있습니까?
TypeScript에서 인터페이스는 호출 서명을 가질 수 있습니다. 귀하의 예에서 다음과 같이 선언 할 수 있습니다.
interface Greeter {
(message: string): void;
}
function sayHi(greeter: Greeter) {
greeter('Hello!');
}
sayHi((msg) => console.log(msg)); // msg is inferred as string
유형 별칭 을 사용하여 대리자와 같은 것을 만들 수 있습니다 .
type MyDelegate = (input: string) => void;
C #에서 대리자가하는 것처럼 함수 포인터의 형식 이름을 정의합니다. 다음 예제에서는 일반 유형 매개 변수와 함께 사용합니다.
type Predicate<T> = (item: T) => boolean;
export class List<T> extends Array<T> {
constructor(...items: T[]){
super();
for(let i of items || []){
this.push(i);
}
}
public hasAny(predicate?: Predicate<T>): boolean {
predicate = predicate || (i => true)
for(let item of this) {
if(predicate(item)) return true;
}
return false;
}
}
5 년 후 많은 TS 버전이 type
함수 유형을 선언하기 위해 더 간단한 정의를 사용하고 있음을 알게 되었습니다.
type Greeter = (msg: string) => void;
const someGreeter: Greeter = (msg: string) => `Hi there with ${msg}`;
호출 가능한 표현식에 대한 유형 정의 (이것은 BNF 또는 형식이 아닌 사람을위한 초안입니다 . ) :
callableType: (paramsDef) => returnType
paramsDef: MULTIPLE paramDef SEPARATED BY ,
paramDef: EITHER paramName: paramType
OR optionalParamName?: paramTypeWhenDefined
OR ...manyParamName: eachParamType[]
예:
var func = something as ((...x: any[]) => any);
그런 다음 다음을 수행 할 수 있습니다.
var result = func("a", "b", 2);
나는 이제 @ steelbreeze / delegate를 게시하고 사용합니다 . C # 대리자에 비해 변경 불가능하지만 그렇지 않은 경우에는 잘 작동한다는 점에서 몇 가지 제한이 있습니다 (호출 될 때 호출 된 모든 함수의 결과를 반환 함).
다음과 같은 코드를 작성할 수 있습니다.
import { create as delegate } from "@steelbreeze/delegate";
function world(s: string) {
console.log(s + " world");
}
const one = delegate(s => console.log(s + " Hello world"));
const two = delegate(s => console.log(s + " Hello"), world);
one("A");
two("B");
delegate(one, two)("C");
참조 URL : https://stackoverflow.com/questions/20310369/declare-a-delegate-type-in-typescript
'IT이야기' 카테고리의 다른 글
JavaDoc에서 재정의 된 메서드 (0) | 2021.04.09 |
---|---|
명령 줄을 통해 Git 커밋 메시지에 아포스트로피 (작은 따옴표) 사용 (0) | 2021.04.09 |
설치시 bower가 통계를 요청하지 않도록합니다. (0) | 2021.04.09 |
ConstraintLayout 종횡비 (0) | 2021.04.08 |
Cobertura를 사용하여 코드 검사에서 메서드 제외 (0) | 2021.04.08 |